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

时间:2011-05-11 21:05:35

标签: linqpad

我正在使用实体框架4.1并且无法在linqpad上添加连接,它说我的子实体没有定义实体键。消息是:“实体类型”CashierPaymentType“没有定义键。定义此实体类型的键。” 我认为当我的子表有一个复合键时会发生这种情况。 例如:

表:收银员 ID INT(键) 名称VARCHAR(100)

表:PaymentType ID INT(键) 名称VARCHAR(100)

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

我正在使用linqpad 4.35.1

任何帮助?

1 个答案:

答案 0 :(得分:2)

问题在于,您要告诉LINQPad使用提供程序连接字符串而不是实体框架连接字符串来新建您键入的DbContext。

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

提供程序连接字符串仅在您执行代码优先时才有效(在这种情况下,EF会推断模型)。在您的情况下,EDM是您项目的一部分,并嵌入到您的程序集中;因此,您必须指定app.config中指定的完整EF连接字符串,以便EF可以找到它:

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文件:

name=TestDatabaseEntities

如果您在LINQPad中执行此操作,请确保在提供的文本框中告知app.config文件所在的位置。

更微妙的一点是,DbContext的T4文件与VS创建的默认值不同,因为您的DbContext缺少以下代码:

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

如果存在此覆盖,则在指定错误类型的连接字符串时会显示更有用的错误消息。