0

こんにちは、最初にエンティティ フレームワーク コードを使用して汎用リポジトリを作成し、すべてを UnitOfWork にカプセル化しようとしていますが、それを追加してカプセル化された SaveChanges を使用しようとすると機能しないため、何かが間違っているに違いありません。ここに私のリポジトリコードがあります:

public class Repository<T> : IRepository<T> where T : class
{
    private DbContext Context { get; set; }
    private DbSet<T> DbSet
    {
        get { return Context.Set<T>(); }
    }

    public Repository(DbContext context)
    {
        Context = context;
    } 

    public virtual IEnumerable<T> GetAll()
    {
        return DbSet;
    }

    public virtual T GetById(int id)
    {
        return DbSet.Find(id);
    }

    public virtual void Add(T entity)
    {
        DbEntityEntry dbEntityEntry = Context.Entry(entity);
        if (dbEntityEntry.State != EntityState.Detached)
        {
            dbEntityEntry.State = EntityState.Added;
        }
        else
        {

            DbSet.Add(entity);
        }
    }

    public virtual void Update(T entity)
    {
        DbEntityEntry dbEntityEntry = Context.Entry(entity);
        if (dbEntityEntry.State == EntityState.Detached)
        {
            DbSet.Attach(entity);
        }
        DbSet.Attach(entity);
    }

    public virtual void Remove(T entity)
    {
        DbEntityEntry dbEntityEntry = Context.Entry(entity);
        if (dbEntityEntry.State != EntityState.Deleted)
        {
            dbEntityEntry.State = EntityState.Deleted;
        }
        else
        {
            DbSet.Attach(entity);
            DbSet.Remove(entity);   
        }
    }

    public virtual void Remove(int id)
    {
        var entity = GetById(id);
        if (entity == null)
        {
            return;
        }
        Remove(entity);
    }
}

そして、ここに私の UnitOfWork コードがあります:

public class UnitOfWork
{
    private readonly RepositoryFactory repositoryFactory;

    private DatabaseContext DbContext
    {
        get { return new DatabaseContext(); }
    }

    public IRepository<Product> Products
    {
        get
        {
            return repositoryFactory.GetRepository<Product>(DbContext);
        }
    }

    public UnitOfWork()
    {
        repositoryFactory = new RepositoryFactory();
    }

    public void SavaChanges()
    {
        DbContext.SaveChanges();
    }
}

これは、データを追加してデータを取得するために呼び出しているコードです。

var sa = new UnitOfWork();
var repository = sa.Products;;
var result = repository.GetAll();
var resultbyId = repository.GetById(3);

 var product = new Product()
 {
     Name = "sddasd",
     CategoryId = 1,
     SubcategoryId = 1,
     Price = 21,
     Description = "dsadasfas",
     ImagePath = "Dsadas",
     NumberOfProducts = 29
  };
   repository.Add(product);
   sa.SavaChanges()

このコードを実行した後、何らかの理由で UnitOfWork クラスにカプセル化された SaveChanges が機能しないようです。

しかし、たとえば、DbSet.Add(entity) の直後にこの行を追加するとします。

Context.SaveChanges() 

オブジェクトがデータベースに追加されたようです。

UnitOfWork SaveChanges メソッドを機能させるにはどうすればよいですか?

4

1 に答える 1

3

コードの問題は次のとおりです。

private DatabaseContext DbContext
{
    get { return new DatabaseContext(); }
}

効果的に行っているのは、プロパティにアクセスするたびに新しいコンテキストを作成することです。Repository<T>1 つのコンテキストを正しく保存して同じコンテキストを再利用しますが、呼び出すと、新しく作成されたコンテキストを変更せずにUnitOfWork.SaveChanges保存しています。

UnitOfWork の精神に則り、コンテキストを囲んでいるクラス ( ) の存続期間全体にわたって存続させたいと考えていますUnitOfWork。これを試して:

private DatabaseContext dbContext;
private DatabaseContext DbContext
{
    get { return dbContext ?? (dbContext = new DatabaseContext()); }
}

このように、あなたのwill は、プロパティへの最初のアクセス時に、DatabaseContextあなたの の有効期間内に 1 回だけ作成されます。UnitOfWorkDbContext

于 2013-07-18T19:12:22.607 に答える