0

例:

新しい請求書を入力しています。この請求書では、顧客を入力する必要があります。顧客のリストを取得したと仮定します。

var list = Context.Set<Customer>().ToList();

ここに2つの問題があります。

1)お客様にすべての情報を提供する必要はありません。必要なのは、ID、コード、名前のみです。

2)現在のDbContextの顧客は読み取り専用であるため、パフォーマンスを向上させるために、状態を監視しないようにDbContextに指示できると便利です。

質問:

1)顧客のデータの一部のみをロードしても、それを請求書に割り当てることはできますか(以下のコードを参照)?

2)DbContextに、顧客の変更を監視しないように指示しても、これを実行できるようにすることはできますか?

Invoice.Customer = CustomerList[10];
4

1 に答える 1

2

あなたが望むことを正確に行うための直接的な方法はありませんが、ある程度の妥協で目標を達成できるかもしれません.

顧客にすべての情報を提供する必要はありません。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();
于 2012-09-21T14:41:05.827 に答える