0

У меня есть 2 таблицы: таблица ордеров и таблица OrderActivity. Если в заказе не было предпринято никаких действий, в таблице OrderActivity не будет записи. В настоящее время я таблица OrderActivity отображенной в качестве дополнительной навигационной собственности на сущности заказа, и я обрабатывать обновления OrderActivity так:Разделение сущностей с необязательным отношением - (сначала код EF)

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

Можно ли закрепить это таким образом, что столбцы таблицы OrderActivity отображается в свойства на объекте «Заказы» и будет по умолчанию, если нет записи OrderActivity? Конфигурация для разделения объектов только работает, если записи существуют в обеих таблицах. Если это невозможно, то какова наилучшая практика для сглаживания дочернего объекта из моей модели домена? Моя цель - максимально упростить модель при взаимодействии с схемой БД, которой я не контролирую.

+0

Вы хотите, чтобы ваш клиентский код не мог получить доступ к заказу.OrderActivity? –

+0

В принципе да ... единственное, что order.OrderActivity предоставляет LastAccessDateTime, поэтому я хочу сгладить два объекта и обработать свойство LastAccessDateTime как часть заказа. Я знаю, что это возможно, сопоставляя сущность с разными таблицами, но могу ли я сделать это, если в DB – Eric

+0

не будет записи OrderActivity. Вы можете сделать это, но всегда будут значения в OrderActivity с LastAccessDate, имеющими значение или null. см. мой ответ, если это поможет. –

ответ

0

Вы можете создать сопоставление и указать тип LastAccessDate как Nullable<DateTime>. Отображение создаст один-к-одному, а 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(); 

Примечание. Это всегда будет создавать одну запись в каждой таблице. Это необходимо, потому что EF создает INNER JOIN, когда вы извлекаете Заказы, и вы хотите получить все заказы в этом случае. LastAccessDate будет либо иметь значение, либо быть нулевым.

// Gets both orders 
var order = db.Orders.ToList(); 
// Gets only the one with activity 
var orders = db.Orders.Where(o => o.LastAccessDate != null); 
Смежные вопросы