我选择数据库优先:
以下是遇到此问题的示例表。如您所见,EntityId列是主键:
模型浏览器中导入的表显示它具有主键:
但是生成的类的代码没有使用Key属性修饰的EntityId列:
在运行时我收到此错误:
其他信息:检测到一个或多个验证错误 在模型生成期间:EntityType'Entity'没有定义键。 定义此EntityType的密钥。
为什么我必须使用Key Attribtue手动装饰EntityId列?难道EntityFramework会考虑所有考虑到它是数据库的吗?
答案 0 :(得分:0)
一般来说,我有使用EF4到EF 6.1.3的经验,还有很多有Entity Core的经验(EF7,然后是命名的MS乐趣)。通常,如果您首先使用数据库,则不会从t4模板中获得装饰。我刚刚看了一眼,我没有装饰钥匙,只是为了构造函数和teOrder导航的参考。
我可以保存一个实体就好了,我的代码就是这样运行的:
using (var context = new EntityTesting.TesterEntities())
{
var nPerson = new tePerson { FirstName = "Test", LastName = "Tester" };
context.tePerson.Add(nPerson);
context.SaveChanges();
}
我建议的是:
转到(名称).edmx实体文件并在设计图面上擦除对象,然后将其替换为曲面。无数次,这解决了生成的对象的问题。当你保存它应该自动运行T4模板(* .tt文件)。如果没有,您可以选择它们,右键单击并选择'运行自定义工具'。这只是生成POCO对象或Context对象。
如果这确实是表的错误,通常它没有键。你正在展示它。反正是否有镜像完全相同的表逻辑并确认密钥没有任何异常,只是一个普通的旧密钥主键?
创建一个具有相似结构但不是精确副本和新实体文件的全新表格,并确认您可以创建它。
使用EF表格非常简单,或者像EF一样直截了当。您可以在SQL中创建它们,确保您有一个键,将其添加到设计图面,保存,它会为您生成对象。如果你有其他的东西,如自定义触发器挂钩或其他不同寻常的导航项目,这将是一件事。唯一的另一件事是它有一个非常旧的SQL Type作为键。我知道' Text'类型和EF不能很好地融合在一起。可能有其他类型的行为方式相同。
答案 1 :(得分:0)
通过包含"元数据"修复此问题。连接字符串的一部分。 起初我的连接字符串看起来像这样:
data source=.;initial catalog=TestDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework;
产生了错误。
将我的连接字符串更改为:
metadata=res://*/DbContexts.TestContext.csdl|res://*/DbContexts.TestContext.ssdl|res://*/DbContexts.TestContext.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=TestDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"
在没有遇到错误的情况下执行Context上的允许操作