具有存储库的实体框架的实体状态

时间:2014-09-12 04:44:09

标签: entity-framework repository

我正在使用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

我该怎么做?

2 个答案:

答案 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;任何实体的财产。

相关问题