Entity Framework 4:添加和保存实体的最佳方式是什么?
Entity Framework 4: What is the best way to add and save an entity?
我有一个 BaseRepository class,所有存储库都使用它来保存实体(新的或更新的):
public abstract class BaseRepository
{
protected void Add<T>(T source, CliCEntities context, bool isNew, EntityState state) where T : class
{
if (isNew)
{
context.CreateObjectSet<T>().AddObject(source);
}
else
{
if (state == EntityState.Detached)
{
context.CreateObjectSet<T>().Attach(source);
}
}
}
protected void Save(MyEntities context)
{
context.SaveChanges();
}
}
它的名字是这样的:
public class MyEntityRepository : BaseRepository
{
public void Add(MyEntity source, MyEntities context)
{
base.Add(source, context, source.ID == Guid.Empty, source.EntityState);
}
public void Save(MyEntities context) {
base.Save(context);
}
}
问题
调用base.Save()时,数据没有区别,EntityState没有变化。我假设这是因为负载在不同的 Context 实例上,所以当前 Context 不知道任何更改。
我怎样才能更改上面的代码,以便我的源实例修改 EntityState(这样它就可以工作)?
我找到了解决方案:
protected void Add<T>(T source, CliCEntities context, bool isNew, EntityState state) where T : class
{
if (isNew)
{
context.CreateObjectSet<T>().AddObject(source);
}
else
{
if (state == EntityState.Detached)
{
context.CreateObjectSet<T>().Attach(source);
context.ObjectStateManager.ChangeObjectState(source, EntityState.Modified);
}
}
}
最大的区别在于:
context.ObjectStateManager.ChangeObjectState(source, EntityState.Modified);
这样我就可以更改源对象的 EntityState,所以它实际上已经更新了。
我有一个 BaseRepository class,所有存储库都使用它来保存实体(新的或更新的):
public abstract class BaseRepository
{
protected void Add<T>(T source, CliCEntities context, bool isNew, EntityState state) where T : class
{
if (isNew)
{
context.CreateObjectSet<T>().AddObject(source);
}
else
{
if (state == EntityState.Detached)
{
context.CreateObjectSet<T>().Attach(source);
}
}
}
protected void Save(MyEntities context)
{
context.SaveChanges();
}
}
它的名字是这样的:
public class MyEntityRepository : BaseRepository
{
public void Add(MyEntity source, MyEntities context)
{
base.Add(source, context, source.ID == Guid.Empty, source.EntityState);
}
public void Save(MyEntities context) {
base.Save(context);
}
}
问题
调用base.Save()时,数据没有区别,EntityState没有变化。我假设这是因为负载在不同的 Context 实例上,所以当前 Context 不知道任何更改。
我怎样才能更改上面的代码,以便我的源实例修改 EntityState(这样它就可以工作)?
我找到了解决方案:
protected void Add<T>(T source, CliCEntities context, bool isNew, EntityState state) where T : class
{
if (isNew)
{
context.CreateObjectSet<T>().AddObject(source);
}
else
{
if (state == EntityState.Detached)
{
context.CreateObjectSet<T>().Attach(source);
context.ObjectStateManager.ChangeObjectState(source, EntityState.Modified);
}
}
}
最大的区别在于:
context.ObjectStateManager.ChangeObjectState(source, EntityState.Modified);
这样我就可以更改源对象的 EntityState,所以它实际上已经更新了。