我们将BaseEntity定义如下:
public abstract class BaseEntity
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
...
}
由于Ids由DB生成。但是,现在我们要添加种子数据。我添加了以下种子代码:
Country c = new Country()
{
Id = new Guid("251D06A5-E864-4B9F-803B-00E409B0F5AB"),
Name = "Oceania",
RegionType = RegionTypeEnum.Region,
ParentCountryId = worldId
};
AddOrUpdate(c);
在这种情况下,我的“Id”被忽略,并生成了新的Id。因此,种子总是创造新的国家。
因此,我不需要数据库来生成此实体的Id(但我想将BaseEntity用作基类)。我希望在这个实体的代码中定义ID。
您如何建议处理此问题?
答案 0 :(得分:2)
AddOrUpdate有一个重载方法,您可以在其中指定应该考虑哪个属性来决定是否应该添加实体。
AddOrUpdate方法提供了一些重载,允许您提供Func表达式作为第一个参数,它允许您为EF提供一个表达式来评估是否应该运行Add或Update。我的最终代码如下:
context.Departments.AddOrUpdate(
d => d.Name,
new Department() { Name = "English" },
new Department() { Name = "Maths" },
new Department() { Name = "French" }
);
现在可以按预期工作,因为仅在“名称”列上执行比较。
来源:http://www.gregpakes.co.uk/post/using-addordelete-to-seed-data-without-the-key-column