あなたが望むことを正確に行うための直接的な方法はありませんが、ある程度の妥協で目標を達成できるかもしれません.
顧客にすべての情報を提供する必要はありません。ID、コード、名前のみが必要です
EF が部分的に読み込まれたエンティティを作成する方法はありませんが、匿名型を作成できます。
Context.Customers.Select(c => new {Id = c.CustomerId, Code = c.Code, Name = c.Name}).Tolist()
新しい匿名型を使用できる場合は、それを使用するか、そのリストを反復処理して、実際の顧客オブジェクトを作成できます。
現在の DbContext の Customer は読み取り専用であるため、パフォーマンスを向上させるために、状態を監視しないように DbContext に指示できるとよいでしょう。
EF は、探していることを正確に実行するAsNoTracking()の拡張機能を提供します。
var list = Context.Set<Customer>().AsNoTracking().ToList();
上記から何を選択するかによって、次のコードが変わる可能性がありますが、このコードは探しているものを実現します。顧客を部分的に読み込みますが、顧客を請求書に添付することはできます。
注: 顧客を使用する前にコンテキストにアタッチする必要があります。その後、Unchanged の状態に設定すると、既存のデータが上書きされるのを防ぐことができます。
m = new Model();
var list = m.Customers.Select(c => new {Id = c.CustomerId, Code = c.Code, Name = c.Name});
List<Customer> customerList = new List<Customer>();
foreach (var item in list)
{
customerList.Add(new Customer()
{
CustomerId = item.Id,
Code = item.Code,
Name = item.Name
});
}
Invoice i = new Invoice();
var customer = customerList.First();
m.Customers.Attach(customer);
m.Entry(customer).State = EntityState.Unchanged;
i.Customer = customer;
m.Invoices.Add(i);
m.SaveChanges();