2013-09-23 103 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