Одним из требований для прокси-серверов отслеживания изменений является то, что свойство навигации, представляющее конец «многие» отношения, должно возвращать тип, реализующий ICollection
.
Прокси отслеживания изменений также предоставляют классы с автоматическим исправлением взаимосвязей . Например, при выполнении someEmployee.Addresses.Add(address);
прокси автоматически устанавливает address.EmployeeID
в значение 100
, а также присваивает someEmployee
экземпляр свойству навигации address.Employee
:
public class Employee
{
public virtual int EmployeeID { get; set; }
public virtual ICollection<Address> Addresses { get; set; }
}
Employee someEmployee = ...;
Address address = ...;
Console.WriteLine(someEmployee.EmployeeID); // 100
Console.WriteLine(address.EmployeeID); // 20
someEmployee.Addresses.Add(address);
Console.WriteLine(address.EmployeeID); // 100
Console.WriteLine(address.Employee.EmployeeID); // 100
Но если мы изменим определение класса Employee, то по какой-то причине прокси не сможет автоматически исправить отношения:
public class Employee
{
private List<Address> _addresses = new List<Address>();
public virtual int EmployeeID { get; set; }
public virtual ICollection<Address> Addresses
{
get { return _addresses; }
set { _addresses = value.ToList(); }
}
}
Console.WriteLine(someEmployee.EmployeeID); // 100
Console.WriteLine(address.EmployeeID); // 20
someEmployee.Addresses.Add(address);
Console.WriteLine(address.EmployeeID); // 20
Console.WriteLine(address.Employee.EmployeeID); // 20
Свойство навигации Employee.Addresses
возвращает тип, который реализует ICollection
(List<T>
), так почему же прокси не может исправить отношения?
Спасибо
EDIT
Это потому, что сам прокси не фиксирует отношения. Он заменяет ваши созданные экземпляры собственными, но как только вы вызываете value.ToList (), вы выбрасываете его реализацию с логикой исправления.
Но если вызов value.ToList()
является причиной, по которой автоматическое исправление отношений не работает, то удаление метода setter
должно включить автоматическое исправление отношений, но это не так:
public class Employee
{
private List<Address> _addresses = new List<Address>();
public virtual int EmployeeID { get; set; }
public virtual ICollection<Address> Addresses
{
get { return _addresses; }
}
}