C# EntityFrameworkV6。首先是数据库。即使表具有主键,也不使用键装饰属性
我首先选择数据库: 下面是遇到此问题的示例表。如您所见,EntityId列是主键: 模型浏览器中导入的表显示它具有主键: 但生成类的代码没有使用键属性修饰EntityId列: 在运行时,我遇到以下错误: 其他信息:检测到一个或多个验证错误 在模型生成期间:EntityType“Entity”未定义键。 定义此EntityType的键C# EntityFrameworkV6。首先是数据库。即使表具有主键,也不使用键装饰属性,c#,entity-framework,database-first,C#,Entity Framework,Database First,我首先选择数据库: 下面是遇到此问题的示例表。如您所见,EntityId列是主键: 模型浏览器中导入的表显示它具有主键: 但生成类的代码没有使用键属性修饰EntityId列: 在运行时,我遇到以下错误: 其他信息:检测到一个或多个验证错误 在模型生成期间:EntityType“Entity”未定义键。 定义此EntityType的键 为什么我必须手动用键Attribtue修饰EntityId列?EntityFramework不应该首先考虑数据库吗?通常来说,我对EF4到EF6.1.3有经
为什么我必须手动用键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();
}
我的建议是:
使用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();
}
我的建议是:
使用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-您是对的。使用的连接字符串没有元数据部分。一旦我添加了它,我就能够在上下文中对实体集合执行操作了。这个问题依赖于他们,现在没有用了。如果你能修复图像,请这样做。