【问题标题】:Entity Framework 4.0 insert new object errorEntity Framework 4.0 插入新对象错误
【发布时间】:2011-01-22 20:04:54
【问题描述】:

我有一个在 Visual Studio 2010 中使用 Entity Framework 4.0 的项目。我有以下代码:

using (var db = new MyEntities())
{
    var dbLead = db.Leads.CreateObject();
    dbLead.Email = lead.Email;
    db.Leads.AddObject(dbLead);
    db.SaveChanges();
}

其中MyEntities 是通常的EF 对象上下文。 Lead 是 EF 生成的类,映射到数据库中的对应表。除了上面代码中分配的Email 属性外,Lead 类还有一个Id 属性,这里我没有明确设置。所有预期的东西,还没有什么奇怪的。

我在调用db.SaveChanges() 时遇到了一个异常,原因是“主键重复”是问题所在。但是,在数据库中,我将相应的列标记为主键,在 .edmx 设计器中,相应的属性标记为 EntityKey 为 true,StoreGeneratedPattern 标记为 Identity。

几个问题:

  1. 假设基础表的相应列设置为主键,为什么设计器不够聪明,在生成类时默认将 StoreGeneratedPattern 设置为 Identity?在我的例子中,我必须进入设计器中的每个类,并自己为每个主键属性设置这个值(不过,有趣的是,EntityKey 默认设置为 true,正如预期的那样)。

  2. 仍然无法正常工作...为什么?我尝试将 StoreGeneratedPattern 设置为 Computed,但没有运气(预期,否则我想知道为什么将其设置为 Computed 可以解决问题)。

【问题讨论】:

  • 你使用默认的代码生成模板?

标签: .net entity-framework c#-4.0 entity-framework-4


【解决方案1】:

尝试将数据库中Id 列的IsIdentity 设置为Yes。我认为这就是问题所在,因为您提到 EF 本身并未将 StoreGeneratedPattern 设置为 Identity

【讨论】:

  • 在数据库中,Id 列标有主键。根据您的建议,我看了更深一点,发现表本身的 Identity Column 属性是空白的,因此我将其设置为 Id 列。然后我删除了 .edmx 设计器中的 Lead 类并从数据库运行更新。瞧,它生成了 Lead 类,并将 StoreGeneratedPattern 设置为 Identity,现在它可以工作了。这就是IsIdentity 的意思吗?因为我没有看到任何同名的东西。
  • 是的,这就是我的意思(只是重复它在 SQL Server Management Studio 中的方式),如果我不清楚,很抱歉。在任何情况下,该字段是PK,而不是数据库中的Identity,因此 EF 试图一遍又一遍地插入相同的 Id 值(可能为 0),因此失败了。
  • 我没有意识到将字段设置为PK 与将其设置为Identity 意味着不同,但现在已经澄清了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
相关资源
最近更新 更多