2009-07-21 5 views
6
Structure

Mon tableau est cemeilleures pratiques/chemin pour la table détail/Multi Master Insérer dans Entity Framework

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 

Je suis en train d'une opération d'insertion en utilisant Entity Framework en utilisant le code ci-dessous
Est-ce la meilleure façon faire l'insertion?
Je ne suis pas satisfait de la façon dont je reçois l'article complet du produit de l'objet de contexte, au lieu d'être en mesure de simplement attribuer une valeur simple 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 le maître détail insérer ou est-il un meilleur/d'une autre manière.

+0

missing 'Ajouter à ' ... Merci! – nrod

Répondre

2

Ce que vous faites maintenant fonctionnera très bien.

Si vous souhaitez éviter de faire une requête de base de données lors de l'attribution ode.Products, alors vous pouvez utiliser l'alternative suivante:

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

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

+0

Et existe-t-il des raccourcis pour mettre à jour les données de détail principales? –

+0

Je ne suis pas sûr de ce que vous voulez dire. Quel genre de raccourcis attendez-vous? Pouvez-vous être plus précis sur vos besoins? –

+0

Je voulais savoir comment je ferais exactement la même action que ci-dessus mais pour une opération de mise à jour. –

1

Une autre approche serait d'utiliser des objets Stub plutôt que EntityKeys dire

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

etc. En prime ce code fonctionnera avec des objets POCO aussi à l'avenir.

Voir this blog post pour plus d'informations sur cette technique.

+0

J'ai essayé ceci en premier et j'ai trouvé que lorsque j'appelle ctx.SaveChanges() il essaye d'insérer même les produits –