1

私はEF CTP5 POCOを試していて、EF4 EntityModelからPOCOコードのみのアプローチに変換しようとしています。CTP5 POCOコードのみ、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; } 
} 

はので、私は新しい請求書との行を追加することになっています、EF4モデルからPOCOに私の古いコードを変換します。私はマスタークラスを作成し、マスタークラス自体のインスタンスに詳細を追加していました。

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 < ==この時点でnullであるので、私は私がInvoiceLinesのコレクションを作成し、それを設定することになって、またはいくつかがあるのです 請求書自体のインスタンスに行を追加することはできませんこれを行う他の方法。

要するに、POCOコードのみ(CTP5)を使用して、マスター/ディテール行をデータベースに追加する方法を要約します。あなたはその後、請求書オブジェクトを追加することを好む場合

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();  
} 

:ここ

答えて

1

は、これを行うための一つの方法です

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();  
} 

すべてのこれらの作品は、私は、ナビゲーションプロパティのコレクションを初期化し、常にお勧めしますがクラス・コンストラクターでは、実行時にNullReferenceExceptionが発生する可能性はなく、クライアント・コードで毎回実行する必要はありません。

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

私はそれを行うことができますが、私はそれを使用しようとしている方法については、それは不可能ですか?これはCTP5とPOCOコードのみのアプローチでこのようなシナリオを処理する方法ですか? – hazimdikenli

+0

私はリストを渡してみると、あなたの助けを借りて、それが動作するかどうかを確認します。 – hazimdikenli

+0

allright、リストを作成してアイテムを追加すると、子レコードがdbに保存されます。 – hazimdikenli

関連する問題