C# EntityFrameworkV6。首先是数据库。即使表具有主键,也不使用键装饰属性

C# EntityFrameworkV6。首先是数据库。即使表具有主键,也不使用键装饰属性,c#,entity-framework,database-first,C#,Entity Framework,Database First,我首先选择数据库: 下面是遇到此问题的示例表。如您所见,EntityId列是主键: 模型浏览器中导入的表显示它具有主键: 但生成类的代码没有使用键属性修饰EntityId列: 在运行时,我遇到以下错误: 其他信息:检测到一个或多个验证错误 在模型生成期间:EntityType“Entity”未定义键。 定义此EntityType的键 为什么我必须手动用键Attribtue修饰EntityId列?EntityFramework不应该首先考虑数据库吗?通常来说,我对EF4到EF6.1.3有经

我首先选择数据库:

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

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

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

在运行时,我遇到以下错误:

其他信息:检测到一个或多个验证错误 在模型生成期间:EntityType“Entity”未定义键。 定义此EntityType的键


为什么我必须手动用键Attribtue修饰EntityId列?EntityFramework不应该首先考虑数据库吗?

通常来说,我对EF4到EF6.1.3有经验,对EntityCore也有一些经验(是EF7,然后是MS fun命名)。通常,如果您首先使用数据库,则不会从t4模板中获得装饰。我刚才看了一下我的,我没有装饰钥匙,只是为了构造和引用teOrder导航返回它

我可以很好地保存一个实体,并且我的代码使用以下命令运行:

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

    context.tePerson.Add(nPerson);
    context.SaveChanges();
  }
我的建议是:

  • 转到(name).edmx实体文件,在设计图面上擦除对象,然后在图面上替换它。在无数次中,这修复了生成对象的问题。保存时,应自动运行T4模板(*.tt文件)。如果没有,您可以选择它们,右键单击并选择“运行自定义工具”。这只是生成POCO对象或上下文对象

  • 如果这确实是表的一个错误,那么它通常是没有键的。不过,你正在证明它确实如此。无论如何,是否要镜像完全相同的表逻辑,并确认该键没有任何异常,只是一个普通的旧键主键

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


  • 使用EF,表格非常简单,或者尽可能简单。您可以在SQL中创建它们,确保您有一个键,将其添加到设计图面,保存,然后为您生成对象。如果你有其他的东西在引擎盖下,比如定制的程序连接到它或者其他不寻常的导航项目,那将是一回事。唯一的另一件事是,如果它有一个非常旧的SQL类型作为键。我知道“文本”类型和EF不能很好地结合在一起。可能还有其他类型也有相同的行为。

    通常来说,我对EF4到EF6.1.3有经验,对实体核心也有一些经验(是EF7,然后是MS fun命名)。通常,如果您首先使用数据库,则不会从t4模板中获得装饰。我刚才看了一下我的,我没有装饰钥匙,只是为了构造和引用teOrder导航返回它

    我可以很好地保存一个实体,并且我的代码使用以下命令运行:

      using (var context = new EntityTesting.TesterEntities())
      {
        var nPerson = new tePerson { FirstName = "Test", LastName = "Tester" };
    
        context.tePerson.Add(nPerson);
        context.SaveChanges();
      }
    
    我的建议是:

  • 转到(name).edmx实体文件,在设计图面上擦除对象,然后在图面上替换它。在无数次中,这修复了生成对象的问题。保存时,应自动运行T4模板(*.tt文件)。如果没有,您可以选择它们,右键单击并选择“运行自定义工具”。这只是生成POCO对象或上下文对象

  • 如果这确实是表的一个错误,那么它通常是没有键的。不过,你正在证明它确实如此。无论如何,是否要镜像完全相同的表逻辑,并确认该键没有任何异常,只是一个普通的旧键主键

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


  • 使用EF,表格非常简单,或者尽可能简单。您可以在SQL中创建它们,确保您有一个键,将其添加到设计图面,保存,然后为您生成对象。如果你有其他的东西在引擎盖下,比如定制的程序连接到它或者其他不寻常的导航项目,那将是一回事。唯一的另一件事是,如果它有一个非常旧的SQL类型作为键。我知道“文本”类型和EF不能很好地结合在一起。可能还有其他类型的行为与此相同。

    通过在连接字符串中包含“元数据”部分,解决了此问题。 起初,我的连接字符串如下所示:

    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"
    

    允许在没有遇到错误的情况下对上下文执行操作

    通过在连接字符串中包含“元数据”部分,解决了此问题。 起初,我的连接字符串如下所示:

    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"
    

    允许在没有遇到错误的情况下对上下文执行操作

    您似乎使用的是常规连接字符串,而不是实体连接字符串(带有元数据路径)。@Gert Arnold-您是正确的。使用的连接字符串没有元数据部分。一旦我添加了它,我就能够在上下文中对实体集合执行操作了。这个问题依赖于他们,现在没有用了。如果可以修复图像,请修复。您似乎使用的是常规连接字符串,而不是实体连接字符串(带有元数据路径)。@Gert Arnold-您是对的。使用的连接字符串没有元数据部分。一旦我添加了它,我就能够在上下文中对实体集合执行操作了。这个问题依赖于他们,现在没有用了。如果你能修复图像,请这样做。