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

ef core 如何一次从具有外键的不同表中获取数据? (数据库优先)

如何在 prisma 中使用带有外键的 createMany?

如何在不同的数据库中使用带有外键的 django 模型?

如何将 MVVM 与 EF 一起使用(在 SQLite 中使用非常复杂的数据库)?

EF6 中使用复合键的每个具体类型 (TPC) 映射表

EF 4.3 代码首先在同一类型上映射 N:M