Я использую репозиторий для каждого класса с шаблоном 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();