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


101

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

我已经用context.People.AddOrUpdate(p => p.Id, people));了很多成功。

我还有另一个表需要种子,我不知道其中的主键。

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

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

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

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

Answers:


200

试试这个:

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

12
@LadislavMrnka如果标识符需要为复杂类型,那该 context.People.AddOrUpdate(p => new { p.Name.FirstName, p.Name.LastName }, people)怎么办?
— gabe 2014年

3
@LadislavMrnka,如果该属性是可空类型,该怎么办?即 context.People.AddOrUpdate(p => new { p.Birthdate }, people)?
— 2014年

2
这里要注意的一点是,“ people”集合必须是阵列而不是列表。如果您有实体列表,则只需在列表上调用.ToArray()即可。我为此感到挣扎:)-好的答案
— 迪恩·马丁

1
无法使它正常工作。可能是因为(除了复合键中指定的3个属性之外)我还有另一个具有自动生成的数字的ID字段?
— Sonic Soul

@LadislavMrnka在迁移和更新数据库字段后需要保留迁移文件夹(Configuration.cs和...)???
— AminM

1

如果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)什么样的结构?这有可能
— yogen darji

如果我将getter属性设置为The specified type member 'NameId' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
— yogen darji
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.