修改 PK 在 EF4 中保存到数据库

本文关键字:保存 数据库 EF4 PK 修改 | 更新日期: 2023-09-27 18:36:47

我们即将将具有自己的持久性对象Mngr的旧应用程序移动到新的实体框架中,这工作正常。问题是旧的 ObjectMngr 曾经将主键作为字符串,有时以自己的格式,现在为了实现兼容的持久性 leyer,我需要将 EF 配置为使用相同的格式或最终修改实体 PK 的 bevor 保存。

假设这是可能的,有人知道我在哪里可以做到这一点吗?

谢谢

修改 PK 在 EF4 中保存到数据库

这个问题在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是一个ObjectContextIdGenerator应提供提供主键的方法。此代码还要求属性Id位于生成的代码中。

您需要将

主键属性的StoreGeneratedPattern设置为 None 。之后,您可以使用在旧解决方案中使用的相同代码自行分配主键值。