如何在 EF 4.3 中使用带有复杂键的 AddOrUpdate 播种数据

Posted

技术标签:

【中文标题】如何在 EF 4.3 中使用带有复杂键的 AddOrUpdate 播种数据【英文标题】:How to seed data with AddOrUpdate with a complex key in EF 4.3 【发布时间】:2012-05-01 08:54:19 【问题描述】:

我正在尝试使用一些测试数据为开发数据库播种。

我使用context.People.AddOrUpdate(p => p.Id, people)); 非常成功。

我有另一个表需要播种,但我不知道主键。

例如,我想根据名字和姓氏匹配来添加或更新。

我不确定如何正确编写表达式。

context.People.AddOrUpdate(p => p.FirstName && p.LastName, people);

显然是不正确的,但我希望它传达了我正在寻找的解决方案。

【问题讨论】:

【参考方案1】:

试试这个:

context.People.AddOrUpdate(p => new  p.FirstName, p.LastName , people);

【讨论】:

@LadislavMrnka 如果标识符需要是复杂类型,即context.People.AddOrUpdate(p => new p.Name.FirstName, p.Name.LastName , people),该怎么办? @LadislavMrnka,另外,如果属性是可空类型怎么办?即context.People.AddOrUpdate(p => new p.Birthdate , people) ? 这里需要注意的是,'people' 集合需要是一个 ARRAY 而不是一个列表。如果你有一个实体列表,你可以简单地调用列表上的 .ToArray() 。我为那个苦苦挣扎:) - 很好的答案 无法让它工作。可能是因为(除了复合键中指定的 3 个属性之外)我还有一个带有自动生成数字的 ID 字段? @LadislavMrnka 在迁移和更新数据库字段后需要保留迁移文件夹(Configuration.cs 和...)???【参考方案2】:

如果您因为使用导航属性而得到Only primitive types or enumeration types are supported in this context. - 请考虑将外键属性直接添加到实体(可能仅使用 getter)并按照 Ladislav Mrnka 的建议使用它。

【讨论】:

如何在code first方法中添加其他表外键的导航属性?我有像 context.People.AddOrUpdate(p => new p.Name.FirstName, p.Name.LastName , people) 这样的结构?这可能 如果我设置getter属性错误是The specified type member 'NameId' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

以上是关于如何在 EF 4.3 中使用带有复杂键的 AddOrUpdate 播种数据的主要内容,如果未能解决你的问题,请参考以下文章