2013-09-23 2 views
1

Это мой первый день с Simple.Data. Я переношу свой проект с чистого ADO .NET.Simple.Data insert complex object

У меня есть таблица заказа со столбцами:

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); 

Я получаю исключение «CustomerId не может быть NULL» от моего SqlServer.

ответ

1

Я не думаю, что это возможно в данный момент, но Марк смотрит в «позволяя объект графики должны быть сохранены с помощью одного вызова, если это действительно возможно» для v2 (см его блоге: http://blog.markrendle.net/2013/09/18/simple-data-2-0/, особенно в пункте «Лучше 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 проигнорирует оригинальное свойство «Клиент» во время вставки, так как базовая таблица не имеет столбца для этого.

+0

благодарю вас за это. Я просто добавил свойство CustomerId в свой класс Order static, но ваше решение с ToDynamic просто чище. Взгляд в будущее Simple.Data v2. – GrzegorzM

0

Идентификатор клиента не может быть пустым. Вам нужна логика, которая не вставляет данные в db, когда CustomerId имеет значение NULL.

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

Вы неправильно поняли мой вопрос. Клиент && Customer.Id не является нулевым. Я спрашивал: Simple.Data может сопоставлять столбец [Заказ]. [CustomerId] с свойством Customer.Id при вставке. Например, с помощью внешнего ключа между столбцами [Заказ]. [CustomerId] и [Customer]. [Id] (так же, как это делается при выборе данных из базы данных) – GrzegorzM