实体类型“EntityName”没有定义键。定义此实体类型的密钥

问题描述:

我正在使用实体框架4.1,并且无法在linqpad上添加连接,它说我的子实体没有定义实体键。消息是:“实体类型”CashierPaymentType“没有定义密钥,为此实体类型定义密钥。” 我想这是发生在我的子表有复合键的时候。 实施例:实体类型“EntityName”没有定义键。定义此实体类型的密钥

表:出纳 ID INT(密钥) 名称VARCHAR(100)

表:PaymentType ID INT(密钥) 名称VARCHAR(100)

//我认为这是问题! 表:CashierPaymentType CashierID INT(键)(外键) PaymentTypeID INT(键)(外键) 价格SMALLMONEY

我使用linqpad 4.35.1

任何帮助吗?

的问题是,你告诉LINQPad新的您键入的DbContext与提供商连接字符串,而不是一个实体框架的连接字符串

如果使用提供程序连接字符串构造类型化的DbContext,则在Visual Studio中会出现相同的错误。

只有在代码优先的情况下(在这种情况下EF推断模型),提供程序连接字符串才有效。在你的情况下,EDM是你的项目的一部分,并嵌入你的程序集;

metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=TestDatabase;integrated security=True;multipleactiveresultsets=True;App=EntityFramework" 

另一种解决方案是使用下面的连接字符串,会推迟到app.config文件:所以在你的app.config规定,使EF可以找到它,你必须指定完整EF连接字符串

name=TestDatabaseEntities 

如果你在LINQPad中这样做,请确保在提供的文本框中告诉它app.config文件的位置。

一个更微妙的一点是,你的DbContext的T4文件到VS创造,在你的DbContext缺少以下代码默认值不同:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    throw new UnintentionalCodeFirstException(); 
} 

如果覆盖时,它给如果指定错误类型的连接字符串,则会提供更有用的错误消息。