1

这是我使用 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 使用 Insert 提供隐式转换,但是当我尝试这样做时:

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

我从我的 SqlServer 收到异常“CustomerId 不能为 NULL”。

4

2 回答 2

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 将在插入期间忽略原始的“客户”属性,因为基础表没有此列。

于 2013-10-01T06:12:17.260 回答
0

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

if (newOrder.Customer != null && newOrder.Customer.Id != null)
{
    _db.Orders.Insert(new 
    {
         CreationDate=newOrder.CreationDate,
         CustomerId = newOrder.Customer.Id
    });
}
于 2013-09-23T14:58:32.260 回答