我只是想知道在调用ObjectContext.SaveChanges()时是否可以分配自定义主键?
我试图寻找任何解决方案,但似乎我是唯一一个考虑这个问题的人。
当你有一个标识列时会发生同样的情况,一旦调用了ObjectContext.SaveChanges(),EF就会自动分配一个主键,而不是主键是一个自动标识列,我希望自定义我自己的主键。
先谢谢你们。
修改:其他详细信息
示例我有这个类:
public class Transaction()
{
public string ID { get; set; }
public DateTime TransactionDate { get; set; }
}
我不想像这样在对象集中添加类:
Transaction trans = new Transaction()
{
ID = null,
TransactionDate = DateTime.Now
};
ObjectSet.AddObject(trans);
请注意,我还没有分配ID,我希望仅在用户点击“保存”时分配该ID才能分配
ObjectContext.SaveChanges();
一个用户称之为,我将获得一个新的主键并将其分配给 trans 实例。
答案 0 :(得分:1)
不理想但请考虑将模型更改为此。您的POCO现在包含一些不好的逻辑,但它允许您自定义保存以从第三方类库创建您的ID。默认情况下,字符串ID列将解析为类型为nvarchar(128)的主键。在保存之前,您的ID将为null。
public abstract class Entity
{
public virtual void OnSave();
}
public class Transaction : Entity
{
public string ID { get; set; }
public DateTime TransactionDate { get; set; }
public override void OnSave()
{
ID = Guid.NewGuid().ToString(); //call to class library
}
}
您可以通过在DbContext中重写它来挂钩SaveChanges方法
public class MyContext : DbContext
{
public DbSet<Transaction> Trans { get; set; }
public MyContext () : base()
{
}
public override int SaveChanges()
{
var changedEntities = ChangeTracker.Entries();
foreach (var changedEntity in changedEntities)
{
var entity = (Entity)changedEntity.Entity;
entity.OnSave();
}
return base.SaveChanges();
}
}