如何在 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 播种数据的主要内容,如果未能解决你的问题,请参考以下文章