Simple.Data插入复杂对象

时间:2013-09-23 14:54:09

标签: c# insert foreign-keys simple.data

这是我使用Simple.Data的第一天。我正在从纯ADO .NET迁移我的项目。

我有一个包含列的订单表:

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获得异常“CustomerId不能为NULL”。

2 个答案:

答案 0 :(得分:1)

我认为目前不可能,但Mark正在调查“允许通过一次调用保存对象图,如果实际上可以”用于v2(请参阅他的博文:http://blog.markrendle.net/2013/09/18/simple-data-2-0/,特别是“Better WithStuff”段落。

但是,您可以通过将“newOrder”对象转换为动态并简单地“添加”“CustomerId”值来避免复制每个属性值,如下所示:

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”属性,因为基础表没有此列。

答案 1 :(得分:0)

客户ID不能为空。当CustomerId为空时,您需要不将数据插入数据库的逻辑。

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