【问题标题】:Modify PK bevor saving to the DB in EF4修改 PK 以保存到 EF4 中的数据库
【发布时间】:2012-06-12 06:38:49
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: c# .net-4.0 entity-framework-4


    【解决方案1】:

    这个问题在 Stackoverflow 上被问了好几次。请阅读此回复:Does Entity Framework 4 Code First have support for identity generators like NHibernate?

    它解决了您描述的问题。如果您不像您的情况那样使用代码优先方法,则覆盖从 ObjectContext 继承的生成类中的 SaveChanges 方法。 DbContext 类仅用于 Code First 方法。例如:

    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 的特殊生成,MyEntitiesObjectContextIdGenerator 应该提供您提供主键的方法。此代码还要求属性Id 位于生成的代码中。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2016-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-18
        • 2021-03-04
        • 2013-06-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多