.net 如何不为种子实体设置DatabaseGenerateOption.Identity

.net 如何不为种子实体设置DatabaseGenerateOption.Identity,.net,entity-framework,code-first,.net,Entity Framework,Code First,我们对BaseEntity的定义如下: public abstract class BaseEntity { [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid Id { get; set; } ... } 因此,ID由DB生成。但是,现在我们要添加种子数据。我添加了以下种子代码: Country c = new Country()

我们对BaseEntity的定义如下:

public abstract class BaseEntity
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid Id { get; set; }
        ...
}
因此,ID由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


您建议如何处理此问题?

AddOrUpdate有一个重载方法,您可以指定在决定是否应添加实体时应考虑哪些属性

AddOrUpdate方法提供了一些重载,允许您提供一个Func表达式作为第一个参数,该参数允许您为EF提供一个表达式,以评估是否应该运行Add或Update。我的最终代码如下所示:

现在,由于仅对“名称”列执行比较,因此该操作与预期一样有效


来源:

也许这可以解决我问题的一部分,但我仍然希望在代码中为这个实体定义ID。结束这是一个问题-如何在代码中为此实体定义id?如果您的列在数据库中被标识为标识列,它将始终生成一个id,至少这是我的经验。好的,那么解决方案是什么?这对我来说不太好,我完全不知道。也许您应该从禁用Id列的标识开始使用Seed方法,并在方法末尾重新启用标识结束该方法。我没有这方面的经验,但您可以检查这些SQL命令。您可以通过ExecuteSqlCommand()方法执行它们
SET IDENTITY\u INSERT tablename ON
SET IDENTITY\u INSERT tablename OFF
请注意,单词ON/OFF引用了SQL语句插入其自身标识值的能力。
   context.Departments.AddOrUpdate(
    d => d.Name,
    new Department() { Name = "English" },
    new Department() { Name = "Maths" },
    new Department() { Name = "French" }
);