1

Je suis en train EF CTP5 POCO et conversion de EF4 EntityModel au code POCO approche seulement.CTP5 POCO code seul, comment ajouter des enregistrements maître-détail à DB

internal class InvoiceContext : DbContext 
{ 
    public DbSet<Invoice> Invoices {get; set;} 
    public DbSet<InvoiceLine> InvoiceLines {get; set;} 
} 

public class Invoice 
{ 
    public Guid InvoiceId { get; set; } 
    public virtual ICollection<InvoiceLine> Lines { get; set; } 
} 

public class InvoiceLine 
{ 
    public Guid InvoiceLineId { get; set; } 
    public Guid InvoiceId { get; set; } 
    public virtual Invoice Header { get; set; } 
} 

ainsi convertir mon ancien code de modèle EF4 Poco, je suis censé ajouter une nouvelle facture et les lignes. J'avais l'habitude de créer la classe maître et ajouter les détails à l'instance de la classe principale elle-même.

var inv = new Invoice(); 
inv.InvoiceId = Guid.NewGuid(); 
var db = new InvoiceContext(); 
db.Invoices.Add(inv); 
var invLine = new InvoiceLine(); 
invLine = InvoiceLineId = Guid.NewGuid(); 
inv.Lines.Add(invLine); 

inv.Lines < == est nulle à ce moment, donc je ne peux pas ajouter une ligne à l'instance de la facture elle-même suis-je censé créer une collection de InvoiceLines et le mettre, ou est-il un peu autre moyen de le faire.

Donc en bref, comment je peux ajouter des lignes maître/détail à ma base de données en utilisant le code POCO seulement (CTP5).

Répondre

1

Voici une façon de le faire:

using (var db = new Ctp5Context()) 
{ 
    var inv = new Invoice() 
    { 
     InvoiceId = Guid.NewGuid() 
    }; 
    var invLine = new InvoiceLine() 
    { 
     InvoiceLineId = Guid.NewGuid(), 
     Header = inv 
    }; 

    db.InvoiceLines.Add(invLine); 
    db.SaveChanges();  
} 

Si vous préférez ajouter un objet de la facture alors:

using (var db = new Ctp5Context()) 
{ 
    var invLine = new InvoiceLine() 
    { 
     InvoiceLineId = Guid.NewGuid()   
    }; 
    var inv = new Invoice() 
    { 
     InvoiceId = Guid.NewGuid(), 
     Lines = new List<InvoiceLine>() { invLine} 
    }; 

    db.Invoices.Add(inv); 
    db.SaveChanges();  
} 

Bien que tous ces travaux, je vous recommande initialize toujours la collection de la propriété de navigation dans les constructeurs de classe afin que vous n'avez pas besoin de le faire dans le code client à chaque fois et qu'il n'y a aucune chance de frapper NullReferenceException dans le moteur d'exécution:

public class Invoice 
{ 
    public Invoice() 
    { 
     Lines = new List<InvoiceLine>(); 
    } 
    public Guid InvoiceId { get; set; } 
    public virtual ICollection<InvoiceLine> Lines { get; set; } 
} 

... 

using (var db = new Ctp5Context()) 
{ 
    var invLine = new InvoiceLine() 
    { 
     InvoiceLineId = Guid.NewGuid()   
    }; 
    var inv = new Invoice() 
    { 
     InvoiceId = Guid.NewGuid(),   
    }; 
    inv.Lines.Add(invLine); 

    db.Invoices.Add(inv); 
    db.SaveChanges();  
} 
+0

Je vois que je peux le faire, mais ce que sur la façon dont je suis en train de l'utiliser, est-il pas possible? Est-ce la façon de gérer ce genre de scénarios avec l'approche CTP5 et POCO Code seulement. – hazimdikenli

+0

Je vais essayer de passer la liste et voir si cela fonctionne, merci pour votre aide. – hazimdikenli

+0

Allright, la création de la liste et l'ajout d'éléments enregistre les enregistrements enfants à db. – hazimdikenli

Questions connexes