您可以創建映射並將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);
你的意思是你想阻止你的客戶端代碼訪問order.OrderActivity? –
基本上是... order.OrderActivity提供的唯一的事情是LastAccessDateTime,所以我想扁平化這兩個對象並將LastAccessDateTime屬性視爲Order的一部分。我知道這可以通過映射實體到不同的表,但我可以這樣做,如果有時不會有DB中的OrderActivity記錄 – Eric
您可以做到這一點,但總是會有OrderActivity中的值與LastAccessDate值或空。看到我的答案,如果有幫助。 –