【问题标题】:Assigning ids to entities with EntityFramework 4使用 EntityFramework 4 为实体分配 id
【发布时间】:2011-04-27 07:34:40
【问题描述】:

我想为我的实体实现“默认”ID 生成支持。

保存实体时,我希望 EntityFramework 仅在尚未设置的情况下为实体生成 id 值。如果 ID 已经有一个非空、非零值,我希望在将实体保存在数据库中时保留该实体 ID。

我正在将数据从旧数据模型(从旧数据库创建的 EntityFramework 模型)迁移到新创建的(模型优先)EntityFramework 模型。我们称旧模型为 A,新模型为 T。

通常,我希望 T 个实体在保存时设置其 ID(它们都是 int64),以便长期使用新模型。

目前,我正在根据要从中迁移的相应 A 实体的 Id 显式分配 T 实体 Id。这样迁移结果很容易检查。

但是,虽然我可以在迁移例程中将 T 实体的 id 分配给与 A 实体相同的 id,但在我保存实体后,Id 值已更改。

有没有办法覆盖 T 模型中所有实体的默认保存方法,以便只有在保存之前尚未在实体中设置 id 值时才分配 id 值?

我在这里查看了其他一些 EntityFramework/Id 问题,但在我看来,他们都没有问同样的问题。

感谢任何线索。

【问题讨论】:

    标签: c# entity-framework-4 savechanges


    【解决方案1】:

    我看到您提到您正在使用 Model First。不过,我有一个 Code First 示例,可能会有所帮助。

    在 T 实体上,您在 id 属性上有一个 [Key] 属性,不是吗?如果是这样,您可以使用另一个属性 DatabaseGeneratedAttribute 来强制设置身份。

    public class SomeEntity
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int? SomeEntityID { get; set; }
    }
    

    另外,还有一个 Fluent API 调用可以实现类似的结果:

    public class YourContext : DbContext
    {
        protected override void OnModelCreating( DbModelBuilder dbModelBuilder )
        {
            base.OnModelCreating( dbModelBuilder );
    
            var config = dbModelBuilder.Entity<SomeEntity>();
            config.Property(e => e.SomeEntityID).HasDatabaseGeneratedOption( DatabaseGeneratedOption.None);
        }
    }
    

    【讨论】:

    • 感谢您的回复,埃德。您的意思是在数据库中“强制不设置身份”吗?如果是这样,可以在实体的属性中设置生成模型,以完全禁用数据库中的 ID 生成。我正在寻找的是如果尚未分配身份,则会在数据库中自动分配身份的东西。 IOW,条件分配或默认分配。
    • 上面的代码确实会强制不设置key。听起来我们不是您想要的。我不知道 EF 可以做些什么来帮助你。
    • 再次感谢您的回复,Ed。我想也许我可以将此技术用于我必须执行数据迁移并通过将部分类放入迁移代码本身来显式分配密钥的场景,然后允许 EF 在新的生产应用程序中为我生成密钥。我会投票赞成你的答案,但不会选择它作为 the 答案,因为我仍然希望得到我的问题中描述的行为。
    【解决方案2】:

    在继续搜索、阅读和与一些比我现在更了解 EF 的朋友讨论之后,我认为通过当前 Entity Framework 实现实现我正在寻找的唯一实用、可持续的方法是创建一个自定义实体框架提供程序,如 this blog post 中所述。

    我是否有时间实施这是我必须弄清楚的事情,但我想我至少会总结这个答案。自定义提供程序还允许人们在实体的读取属性上实现解密/在写入属性时加密。

    不过,我希望在 EntityFramework 的未来版本中看到这些功能。

    【讨论】:

      猜你喜欢
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多