変更追跡プロキシの要件の1つは、リレーションシップの「多くの」末尾を表すナビゲーションプロパティが、ICollection
を実装するタイプを返す必要があることです。POCOプロキシが自動的にリレーションシップを設定できない
また、変更追跡プロキシは、の自動関係の修復のクラスも提供します。例えば、someEmployee.Addresses.Add(address);
が実行された場合、プロキシは自動的に100
の値にaddress.EmployeeID
を設定し、また、ナビゲーションプロパティaddress.Employee
にsomeEmployee
インスタンスを割り当てます。
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クラスの定義を変更した場合何らかの理由でプロキシISNのために自動的に修正アップする関係をできる「T:ICollection
を実装タイプ(List<T>
)を返しませんので、なぜ修正アップするトンをでき代理ではありませんEmployee.Addresses
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
ナビゲーションプロパティ彼の関係?
は、プロキシ自体が関係に修復していないので、それはあなたに
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; }
}
}
まだ動作しません – user702769
作業用のソリューションからコピーしました –
あなたは正しいです。あなたの提案がうまくいかなかった理由は、プロパティの1つが仮想とマークされていないためです。とにかく、自動リレーションシップフィックスアップが機能しない理由は、value.List()を呼び出すことによるものなのでしょうか? – user702769