实体类型“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();
}
如果覆盖时,它给如果指定错误类型的连接字符串,则会提供更有用的错误消息。