Entity Framework Code First - непосредственно обновляет вложенный объект - PullRequest
0 голосов
/ 22 апреля 2011

Я использую репозиторий для каждого класса с шаблоном UnitOfWork в приложении Winform и хочу обновить вложенный объект по его идентификатору непосредственно в отдельном окне, но он не работает.

Мои классы выглядят так:

public class Studio
{
    public int Id { get; set; } 
    public string StudioName { get; set; }
    ...
    // Navigation properties
    public virtual ICollection<StudioPayment> StudioPayment { get; set; }
}

public class StudioPayment
{
    public int Id { get; set; } 
    public string Title { get; set; }
    ...
    // Navigation properties
    public virtual Studio Studio { get; set; } 
}

Реализация UoW:

public class EFUnitOfWork : IUnitOfWork
{
    public DbContext Context { get; set; }

    public EFUnitOfWork()
    {
        Context = new Entities();
    }

    public void Save()
    {
        Context.SaveChanges();
    }

    public bool LazyLoadingEnabled
    {
        get { return Context.Configuration.LazyLoadingEnabled; }
        set { Context.Configuration.LazyLoadingEnabled = value; }
    }

    public string ConnectionString
    {
        get { return Context.Database.Connection.ConnectionString; }
        set { Context.Database.Connection.ConnectionString = value; }
    }

    public void Disopse()
    {
        Context.Dispose();
    }
}

Реализация репозитория

public class EFRepository<T> : IRepository<T> where T : class
{
    public IUnitOfWork UnitOfWork { get; set; }
    private IDbSet<T> _dbset;

    private IDbSet<T> DbSet
    {
        get
        {
            if (_dbset == null)
            {
                _dbset = UnitOfWork.Context.Set<T>();
            }
            return _dbset;
        }
    }

    public virtual IEnumerable<T> All()
    {
        return DbSet.ToList();
    }

    public IEnumerable<T> Find(Func<T, bool> expression)
    {
        return DbSet.Where(expression).AsQueryable();
    }

    public void Add(T entity)
    {
        DbSet.Add(entity);
    }

    public void Delete(T entity)
    {
        DbSet.Remove(entity);
    }

    public void Save()
    {
        UnitOfWork.Save();
    }

    public T Attache(T entity)
    {
        return DbSet.Attach(entity);
    }

    public T FindById(params object[] keyValues)
    {
        return DbSet.Find(keyValues);
    }

    public void Reload(T entity)
    {
        UnitOfWork.Context.Entry(entity).Reload();
    }

    public bool IsValid(T entity)
    {
        return UnitOfWork.Context.Entry(entity).GetValidationResult().IsValid;
    }

    public void Dispose()
    {
        UnitOfWork.Disopse();
    }
}

StudioPaymentRepository

public partial class StudioPaymentRepository
{
    private IRepository<StudioPayment> _repository {get;set;}
    public IRepository<StudioPayment> Repository
    {
        get { return _repository; }
        set { _repository = value; }
    }

    public StudioPaymentRepository(IRepository<StudioPayment> repository, IUnitOfWork unitOfWork)
    {
        Repository = repository;
        Repository.UnitOfWork = unitOfWork;
    }

    public IEnumerable<StudioPayment> All()
    {
        return Repository.All();
    }

    public void Add(StudioPayment entity)
    {
        Repository.Add(entity);
    }

    public void Delete(StudioPayment entity)
    {
        Repository.Delete(entity);
    }

    public void Save()
    {
        Repository.Save();
    }
}

Образец кода:

EFUnitOfWork uow = new EFUnitOfWork();
studioPaymentRepository = new StudioPaymentRepository(new EFRepository<StudioPayment>(), uow);
StudioPayment sp = studioPaymentRepository.Repository.FindById(1);
sp.Title = "First payment";
uow.save(); // take no action
uow.Dispose();
...