Méthodes conseillées / chemin pour l'insertion de détails principaux / multi-tables dans Entity Framework

.net entity-framework linq linq-to-entities

Question

Ma structure de table est la suivante

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

J'essaie d'effectuer une opération d'insertion à l'aide d'Entity Framework à l'aide du code ci-dessous.
Est-ce la meilleure façon de faire l'insertion?
Je ne suis pas satisfait de la manière dont je récupère l'intégralité du produit à partir de l'objet context, au lieu de pouvoir simplement attribuer une valeur 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();
}

Est-ce la bonne façon de faire l'insertion du détail principal ou y a-t-il une meilleure / une autre façon?

Réponse acceptée

Ce que vous faites maintenant fonctionnera parfaitement.

Si vous souhaitez éviter de faire une requête à la base de données lors de l'affectation de ode.Products, vous pouvez utiliser la solution suivante:

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

C'est plus rapide, mais moins lisible. De plus, la propriété Products sera nulle jusqu'à ce que vous la chargiez. Mais pour un insert, c'est souvent OK.


Réponse populaire

Une autre approche consisterait à utiliser des objets de remplacement plutôt qu’EntityKeys

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

etc. En prime, ce code fonctionnera également à l'avenir avec les objets POCO.

Voir ce billet de blog pour plus d'informations sur cette technique.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow