我想为我的实体实施“默认”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问题,但在我看来,他们中没有一个问同样的问题。
感谢任何线索。
答案 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版本中看到的东西。