使用实体框架4为实体分配ID

时间:2011-04-13 01:57:45

标签: c# entity-framework-4 savechanges

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

保存实体时,我希望EntityFramework只生成实体的id值(如果尚未设置)。如果ID已经具有非null,非零值,我希望在将实体保存在数据库中时保留该实体ID。

我正在将数据从遗留数据模型(从旧数据库创建的EntityFramework模型)迁移到新创建的(模型优先)EntityFramework模型。让我们调用旧模型A和新模型T.

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

目前,我明确地根据我正在迁移的相应A实体的Id来分配T实体ID。这样就很容易检查迁移结果。

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

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

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

感谢任何线索。

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:3)

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

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

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