如何在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.