我正在使用Julie Lerman的EF Repository技术。
我的所有实体都实现了以下界面
public interface IEntity
{
EntityState State { get; set; }
}
我的所有存储库都调用以下GetList函数
public virtual IList<T> GetList(Func<T, bool> where, params Expression<Func<T, object>>[] navigationProperties)
{
List<T> list;
IQueryable<T> dbQuery = ((DbContext)context).Set<T>();
//Apply eager loading
foreach (var navigationProperty in navigationProperties)
{
dbQuery = dbQuery.Include(navigationProperty);
}
list = dbQuery.AsNoTracking().Where(where).ToList();
return list;
}
我发现我的实体的初始状态属性为零,但我想将其设置为 我想将State属性设置为EntityState.Unchanged
我该怎么做?
答案 0 :(得分:1)
Julie Lerman在她的书Programming Entity Framework: DbContext
中描述了这一点
(例4-15)。
您可以在DbContext constractor
中使用以下代码将对象状态设置为UnChanged
:
public YourContext()
{
((IObjectContextAdapter)this).ObjectContext .ObjectMaterialized +=
(sender, args) =>
{
var entity = args.Entity as IEntity;
if (entity != null)
{
entity.State = State.Unchanged;
}
}
}
答案 1 :(得分:0)
这是解决此问题的另一种更简单的方法。我正在使用它,它的工作原理!!
public abstract class Entity<TId> : BaseEntity, IEntity<TId>, IModelState
{
public virtual TId Id { get; private set; }
public byte[] RowVersion { get; protected set; }
private readonly IDictionary<Type, IEvent> events = new Dictionary<Type, IEvent>();
public IEnumerable<IEvent> Events => events.Values;
public ModelState ModelState {get;保护集; } = ModelState.Unchanged;
protected Entity()
{
ModelState = ModelState.Added;
}
... removed for brevity
确保您在.NET 4.6.x中使用C#7和Roslyn Compiler
我认为这样更安全,因为只有你自己的实体对象才有权在EF初始化时将其设置为不变。在我看来,DbContext不应该有权设置&#34;状态&#34;任何实体的财产。