EF4: сохранить объект детей - PullRequest
0 голосов
/ 24 мая 2011

в базе данных у меня есть эти таблицы: Product, Request и RequestProducts. RequestProducts - это таблица, связывающая множество Продуктов с одним Запросом.

Вот мой код:

        Product newProduct = new Product
                                 {
                                     Unity_ID = 3,
                                     Quantity = 2,
                                     Name = "toto",
                                     AlreadyCurrency = true
                                 };

        Request newRequest = new Request
                                 {
                                     User_ID = 1,
                                     CaseNumber = 1,
                                     Draft = false
                                 };

        newRequest.Products.Add(newProduct);

        _db.AddToProducts(newProduct);
        _db.AddToRequests(newRequest);
        _db.SaveChanges();

После выполнения этого в моей базе данных я получаю 1 товар и 1 запрос. Это нормально, но ссылка для создания со строкой newRequest.Products.Add(newProduct); не создает таблицу RequestProducts, и тем не менее EF4 понимает ссылку, предлагая мне список Products в объекте запроса.

Возможно ли создать эту ссылку только с этим кодом?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 24 мая 2011

Если вы используете сгенерированные объекты EDMX, в вашей таблице Product должен быть один столбец RequestId FK.

Затем, после того как вы сгенерируете EDMX из БД, дополнительных таблиц не будет, поэтому вы сможете сделать это следующим образом:

Request newRequest = new Request
                         {
                             User_ID = 1,
                             CaseNumber = 1,
                             Draft = false
                         };

Product newProduct = new Product
                         {
                             Unity_ID = 3,
                             Quantity = 2,
                             Name = "toto",
                             AlreadyCurrency = true,
                             Request = newRequest
                         };


//Redundant
//newRequest.Products.Add(newProduct);

_db.AddToProducts(newProduct);

//Redundant
_db.AddToRequests(newRequest);

_db.SaveChanges();

//Never forget - or wrap in a using statement
_db.Dispose()

Обновление

  1. В приведенном выше случае one2many (один запрос имеет много продуктов)
  2. , поскольку, как только я установлю Request (который теперь является свойством Product) на newRequest, тогда, когда я добавлю его в контекст (или, если он уже добавлен), все связанные сущности всего графика тоже будет добавлен автоматически.
  3. Прочитайте это внимательно.
0 голосов
/ 24 мая 2011

Вам не нужна дополнительная таблица для отношений один ко многим. Эта дополнительная таблица понадобится вам только для отношений «многие ко многим».

Итак, не зная больше подробностей о том, что вы делаете и почему, я бы сказал, что это работает правильно.

В идеале ваш объект Request должен выглядеть примерно так:

public class Request
{
    public int RequestId {get; set;}
    //Other defining params here

    public ICollection<Product> Products {get; set;}
}

Тогда ваш объект Product будет выглядеть так:

public class Product
{
    public int ProductId {get; set;}
    //other defining params
    public int RequestId {get; set;} //your FK

    public virtual Request Request {get; set;} //If you ever need the Product to be aware of the Request to which it is attached.
}
...