Я реализовал архитектуру, основанную на интерфейсах, чтобы мой бизнес-уровень мог иметь несколько реализаций модели.
public interface IFoo
{
int Id { get; set; }
string Name { get; set; }
ICollection<IBar> IBars{ get; set; } //association with another entity
}
public class Foo : IFoo
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Bar> Bars{ get; set; }
//Interface implementation
public ICollection<IBar> IBars
{
get
{
return Bars.Cast<IBar>().ToList();
//or return new List<ICardInquiry>(CardsInquiries);
}
set
{
if (value is ICollection<IBar>)
Bars= ((ICollection<IBar>)value).Cast<Bar>().ToList();
else
throw new NotImplementedException();
}
}
}
Внутри моего контекста у меня будет это:
public interface IMy_Context : IDisposable
{
IList<IFoo> IFoos { get; }
IList<IBar> IBars { get; }
}
...
public class My_Context : DbContext, IMy_Context
{
public DbSet<Bar> Bars{ get; set; }
public DbSet<Foo> Foos{ get; set; }
//interface implementations
public IList<IFoo> IFoos
{
get
{
return Foos.ToList().Cast<IFoo>().ToList();
}
}
public IList<IUser> IBars
{
get
{
return Bars.ToList().Cast<IBar>().ToList();
}
}
}
Это прекрасно работает,Но ... У меня возникает проблема, если я хочу удалить элемент из коллекции:
IFoo iFoo = ...;
IBar iBar = iFoo.IBars.First(b=> ...);
iFoo.Remove(iBar)
Это НЕ удалит элемент!Я понимаю почему.Причина в том, что мой метод получения коллекции интерфейсов выглядит следующим образом:
public ICollection<IBar> IBars
{
get
{
return Bars.Cast<IBar>().ToList();
//or return new List<ICardInquiry>(CardsInquiries);
}
...
}
IBars возвращает новый список, поэтому элемент удаляется из возвращенного списка, а не из исходной коллекции модели (столбцы).
Как мне выйти из этой ситуации и сохранить реализацию интерфейса DAL?