使用EntityFramework 4为实体分配ID

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

感谢任何线索。

我看到你提到你正在使用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(); config.Property(e => e.SomeEntityID).HasDatabaseGeneratedOption( DatabaseGeneratedOption.None); } } 

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

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

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