передовая практика / способ для получения подробной информации / вставка нескольких таблиц в Entity Framework - PullRequest
7 голосов
/ 21 июля 2009

Моя структура таблицы такая

Orders
------ 
Id int identity
OrderDate smalldatetime
OrderStatusid tinyint

Products
--------
Id int identity
Name varchar(50)

OrderDetails
------------
Id int identity
OrderId int (fkey)
ProductId int (fkey)
Amount decimal
Rate decimal

Я пытаюсь выполнить операцию вставки с использованием Entity Framework, используя приведенный ниже код
Это лучший способ сделать вставку?
Меня не устраивает то, как я получаю полный элемент товара из объекта контекста, вместо того, чтобы просто присваивать простое значение productId

using (MyContextEntities ctx = new MyContextEntities())
{
    Orders newOrder = new Orders()
    {
    Name = "Gayle Wynand",
    OrderDate = DateTime.Now,
    IsComplete = true,
    Comments = "test",
    OrderStatusId = 2,
    IsActive = true
    };
    OrderDetails ode = new OrderDetails();
    ode.Products = ctx.Products.First(p => p.Id == 2); // any other way?
    ode.Quantity = 2;
    ode.Rate = 5.2;
    newOrder.OrderDetails.Add(ode);

    OrderDetails ode2 = new OrderDetails();
    ode2.Products = ctx.Products.First(p => p.Id == 3); // any other way?
    ode2.Quantity = 3;
    ode2.Rate =6.5;
    newOrder.OrderDetails.Add(ode2);


    ctx.AddToOrders(newOrder);
    ctx.SaveChanges();
}

Это правильный способ вставки основной детали или есть лучший / другой способ.

Ответы [ 2 ]

2 голосов
/ 21 июля 2009

То, что вы делаете сейчас, будет отлично работать.

Если вы не хотите выполнять запрос к базе данных при назначении ode.Products, вы можете использовать следующую альтернативу:

// substitute your actual qualified entity set name
ode.ProductsReference.EntityKey = 
    new EntityKey("MyEntities.ProductsEntitySetName", "Id", 2);

Это быстрее, но менее читабельно. Кроме того, свойство Products будет иметь нулевое значение, пока вы не загрузите его. Но для вставки это часто нормально.

1 голос
/ 22 июля 2009

Другой подход - использовать объекты-заглушки, а не EntityKeys, т.е.

var product = new Product {ID = 2};
ctx.AttachTo("Products", product);
ode.Product = product;

и т.д.. В качестве дополнительного бонуса этот код будет работать и с объектами POCO в будущем.

См. в этом блоге для получения дополнительной информации об этой технике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...