9

我想为我的实体实现“默认”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 问题,但在我看来,他们都没有问同样的问题。

感谢任何线索。

4

2 回答 2

3

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

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

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

于 2011-04-26T23:34:40.527 回答
3

我看到你提到你正在使用 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);
    }
}
于 2011-04-13T06:10:52.817 回答