0

Orders テーブルと OrderActivity テーブルの 2 つのテーブルがあります。注文に対してアクティビティが行われていない場合、OrderActivity テーブルにはレコードがありません。現在、OrderActivity テーブルを Order エンティティのオプションの nav プロパティとしてマップしており、OrderActivity の更新を次のように処理しています。

if (order.OrderActivity == null)
{
    order.OrderActivity = new OrderActivity();
}
order.OrderActivity.LastAccessDateTime = DateTime.Now;

OrderActivity テーブルの列が Orders エンティティのプロパティにマップされ、OrderActivity レコードがない場合はデフォルトになるように、これを統合することは可能ですか? エンティティ分割の構成は、両方のテーブルにレコードが存在する場合にのみ機能するように見えます。それが不可能な場合、ドメイン モデルから子エンティティを隠すためのベスト プラクティスは何ですか? 私の目標は、私が制御できない DB スキーマとやり取りしながら、モデルをできるだけクリーンに保つことです。

4

1 に答える 1

0

マッピングを作成し、タイプをLastAccessDateas として指定できますNullable<DateTime>。マッピングは、オプションで 1 対 1 を作成しLastAccessDateます。

public class Order {
  [Key] 
  public int Id { get; set; }
  public string Name { get; set; }
  public DateTime? LastAccessDate { get; set; }
}

modelBuilder.Entity<Order>().Map(m => {
          m.Properties(a => new { a.Id, a.Name });
          m.ToTable("Order");
        }).Map(m => {
          m.Properties(b => new { b.Id, b.LastAccessDate });
          m.ToTable("OrderActivity");
        });

この場合、LastAccessDate新しい注文を挿入するときのプロパティの指定はオプションです。

var order = new Order();
order.Name = "OrderWithActivity";
order.LastAccessDate = DateTime.Now;
db.Orders.Add(order);
db.SaveChanges();

order = new Order();
order.Name = "OrderWithoutActivity";
db.Orders.Add(order);
db.SaveChanges();

これにより、常に各テーブルに 1 つのエントリが作成されることに注意してください。Orders を取得するときにEF が作成INNER JOINし、この場合はすべての注文を取得する必要があるため、これが必要です。LastAccessDate値を持つか、null になります。

// Gets both orders
var order = db.Orders.ToList();
// Gets only the one with activity
var orders = db.Orders.Where(o => o.LastAccessDate != null);
于 2013-05-22T03:11:56.680 に答える