EntityFramework v6。数据库第一。即使表具有主键,也不使用Key装饰属性

时间:2017-02-08 14:54:55

标签: c# entity-framework database-first

我选择数据库优先: Imgur

以下是遇到此问题的示例表。如您所见,EntityId列是主键:

Imgur

模型浏览器中导入的表显示它具有主键:

Imgur

但是生成的类的代码没有使用Key属性修饰的EntityId列:

Imgur

在运行时我收到此错误:

  

其他信息:检测到一个或多个验证错误   在模型生成期间:EntityType'Entity'没有定义键。   定义此EntityType的密钥。

为什么我必须使用Key Attribtue手动装饰EntityId列?难道EntityFramework会考虑所有考虑到它是数据库的吗?

2 个答案:

答案 0 :(得分:0)

一般来说,我有使用EF4到EF 6.1.3的经验,还有很多有Entity Core的经验(EF7,然后是命名的MS乐趣)。通常,如果您首先使用数据库,则不会从t4模板中获得装饰。我刚刚看了一眼,我没有装饰钥匙,只是为了构造函数和teOrder导航的参考。

enter image description here

我可以保存一个实体就好了,我的代码就是这样运行的:

  using (var context = new EntityTesting.TesterEntities())
  {
    var nPerson = new tePerson { FirstName = "Test", LastName = "Tester" };

    context.tePerson.Add(nPerson);
    context.SaveChanges();
  }

我建议的是:

  1. 转到(名称).edmx实体文件并在设计图面上擦除对象,然后将其替换为曲面。无数次,这解决了生成的对象的问题。当你保存它应该自动运行T4模板(* .tt文件)。如果没有,您可以选择它们,右键单击并选择'运行自定义工具'。这只是生成POCO对象或Context对象。

  2. 如果这确实是表的错误,通常它没有键。你正在展示它。反正是否有镜像完全相同的表逻辑并确认密钥没有任何异常,只是一个普通的旧密钥主键?

  3. 创建一个具有相似结构但不是精确副本和新实体文件的全新表格,并确认您可以创建它。

  4. 使用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上的允许操作