我们即将将具有自己持久性 objectMngr 的旧应用程序移动到新的实体框架,这工作正常。问题是旧的 ObjectMngr 过去常常将主键作为字符串,有时以自己的格式保存,现在为了实现兼容的持久性,我需要将 EF 配置为使用相同的格式,或者最终修改实体 PK 的保存.
我假设这是可能的,有人知道我在哪里可以做到吗?
谢谢
我们即将将具有自己持久性 objectMngr 的旧应用程序移动到新的实体框架,这工作正常。问题是旧的 ObjectMngr 过去常常将主键作为字符串,有时以自己的格式保存,现在为了实现兼容的持久性,我需要将 EF 配置为使用相同的格式,或者最终修改实体 PK 的保存.
我假设这是可能的,有人知道我在哪里可以做到吗?
谢谢
您需要将StoreGeneratedPattern
主键属性设置为None
. 之后,您可以使用您在旧解决方案中使用的相同代码自己分配主键值。
这个问题在 Stackoverflow 上被问了好几次。请阅读此回复:Entity Framework 4 Code First 是否支持 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);
}
}
此示例假设您IEntity
为模型中的所有类(如MyEntity
)实现,这取决于 PK 的特殊生成,并且MyEntities
是ObjectContext
. IdGenerator
应该提供您提供主键的方法。此代码还要求该属性Id
位于生成的代码中。