修改 PK 在 EF4 中保存到数据库
本文关键字:保存 数据库 EF4 PK 修改 | 更新日期: 2023-09-27 18:36:47
我们即将将具有自己的持久性对象Mngr的旧应用程序移动到新的实体框架中,这工作正常。问题是旧的 ObjectMngr 曾经将主键作为字符串,有时以自己的格式,现在为了实现兼容的持久性 leyer,我需要将 EF 配置为使用相同的格式或最终修改实体 PK 的 bevor 保存。
我假设这是可能的,有人知道我在哪里可以做到这一点吗?
谢谢
这个问题在Stackoverflow上被问了好几次。请阅读此响应:实体框架 4 Code First 是否支持像 NHibernate 这样的标识生成器?
它解决了您描述的问题。如果不像现在这样使用代码优先方法,则覆盖从 ObjectContext 继承的生成类中的 SaveChanges 方法。类 DbContext 仅用于代码优先方法。例如:
public interface IEntity
{
string Id { get; set; }
}
public partial class MyEntity: IEntity
{
}
public partial class MyEntities
{
public override int SaveChanges(System.Data.Objects.SaveOptions options)
{
var generator = new IdGenerator();
foreach(var entry in this.ObjectStateManager.GetObjectStateEntries(EntityState.Added))
{
var entity = entry.Entity as IEntity;
if (entity != null)
{
entity.Id = generator.CreateNewId();
}
}
return base.SaveChanges(options);
}
}
此示例假设您为模型中的所有类(如 MyEntity
)实现了 IEntity
,这取决于 PK 的特殊生成,并且MyEntities
是一个ObjectContext
。 IdGenerator
应提供提供主键的方法。此代码还要求属性Id
位于生成的代码中。
您需要将
主键属性的StoreGeneratedPattern
设置为 None
。之后,您可以使用在旧解决方案中使用的相同代码自行分配主键值。