这是我使用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”。
答案 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
});
}