一年前提出的这个问题与此类似: Does the Entity Framework 4 support generators for id values like NHibernate?
但我想知道的是,代码首先是CTP是否增加了对身份生成策略的支持。如果没有,有没有人知道EF中一个很好的扩展点来实现类似的东西?
我目前正在使用使用GUID作为标识符的模型类。使用EF插入时,它们会保留Guid.Empty
个初始值。我知道您可以将数据库中的列的默认值设置为newid()
,但这会破坏客户端身份生成的目的。
实体框架是否还不够成熟,无法在分布式,断开连接的系统中使用?
答案 0 :(得分:16)
不,实体框架代码优先仍然是围绕EFv4的好包装。没有像生成器这样的NHibernate。如果您想要客户端ID生成器,则必须覆盖派生SaveChanges
中的DbContext
并实现您自己的逻辑,将ID分配给新实体。
修改强>
一些高级示例:
public class Context : DbContext
{
// Helper for example
// DO NOT USE IN REAL SCENARIOS!!!
private static int i = 0;
public DbSet<MyEntity> MyEntities { get; private set; }
public Context()
: base("connection")
{
MyEntities = Set<MyEntity>();
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<MyEntity>().HasKey(e => e.Id);
// Turn off autogeneration in database
modelBuilder.Entity<MyEntity>()
.Property(e => e.Id)
.HasDatabaseGeneratedOption(HasDatabaseGeneratedOption.None);
// Other mapping
}
public override int SaveChanges()
{
foreach (var entry in ChangeTracker.Entries<MyEntity>()
.Where(e => e.State == EntityState.Added))
{
// Here you have to add some logic to generate Id
// I'm using just static field
entry.Entity.Id = ++i;
}
return base.SaveChanges();
}
}
public class MyEntity
{
public int Id { get; set; }
// Other properties
}
答案 1 :(得分:6)
没有
NuGet安装的Mine Entity Framework 4.1.10715。 也许你可以使用属性
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id {get;set;}
请参阅(EF 4.1支持的注释的完整列表:页面中的CTRL + F)here。
答案 2 :(得分:-1)
[Key]
public string Id { get; set; }
然后使用新的GUID ToString
Units.Add( new Unit(){Id=Guid.NewGuid().ToString(), Name="123"});