2013-09-23 60 views
1

這是我第一次使用Simple.Data。我正在從純ADO .NET遷移我的項目。Simple.Data插入複雜對象

我有列的順序表:

Id 
CreationDate 
CustomerId -> FK to Customer table 

在我的項目中的Order類:

int Id 
DateTime CreationDate  
Customer Customer 

要插入新秩序的數據庫我做:

var newOrder=... 
_db.Orders.Insert(new { 
         CreationDate=newOrder.CreationDate, 
         CustomerId = newOrder.Customer.Id 
         } 
       ); 

是否可以簡單地做到這一點?對我而言,簡單意味着不創建新的匿名對象並複製每個屬性值。我知道Simple.Data提供隱式轉換與插入,但是當我試圖這樣的:

var newOrder=... 
_db.Orders.Insert(newOrder); 

我得到了異常「客戶編號不能爲空」從我的SqlServer。

回答

1

我不認爲這是可能的時刻,但馬克正在爲「允許對象圖被保存爲單個呼叫,如果這實際上可能」爲V2(看他的博客文章: http://blog.markrendle.net/2013/09/18/simple-data-2-0/,尤其是「Better WithStuff」段落)。

但是你能避免你的「newOrder」對象轉換爲動態的,簡單的「加入」的「客戶編號」值給它,這樣複製的每個屬性值:

var d = newOrder.ToDynamic(); 
d.CustomerId = newOrder.Customer.Id; 
_db.Orders.Insert(d); 

其中「ToDynamic()」是一個簡單的擴展方法:

public static dynamic ToDynamic(this object @this) 
{ 
    IDictionary<string, object> expando = new ExpandoObject(); 

    foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(@this.GetType())) 
    { 
     expando.Add(property.Name, property.GetValue(@this)); 
    } 

    return expando as ExpandoObject; 
} 

Simple.Data將在插入期間忽略原始「Customer」屬性,因爲基礎表沒有列。

+0

非常感謝。我剛剛將OrderId屬性靜態添加到我的Order類中,但ToDynamic的解決方案只是更乾淨。期待Simple.Data v2。 – GrzegorzM

0

客戶ID不能爲空。當CustomerId爲空時,您需要的邏輯不會將數據插入數據庫。

if (newOrder.Customer != null && newOrder.Customer.Id != null) 
{ 
    _db.Orders.Insert(new 
    { 
     CreationDate=newOrder.CreationDate, 
     CustomerId = newOrder.Customer.Id 
    }); 
} 
+1

你誤解了我的問題。 Customer && Customer.Id肯定不是null。我問,Simple.Data可以在插入時與Customer.Id屬性匹配[Order]。[CustomerId]列。例如通過[Order]。[CustomerId]和[Customer]。[Id]列之間的外鍵(就像在從數據庫中選擇數據時一樣) – GrzegorzM