1

私はEF CTP5 POCOを試しており、EF4 EntityModelからPOCOコードのみのアプローチに変換しています。

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) を使用してデータベースにマスター/詳細行を追加する方法を簡単に説明します。

4

1 に答える 1

1

これを行う1つの方法は次のとおりです。

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

請求書オブジェクトを追加する場合は、次のようにします。

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();      
}
于 2011-01-28T15:33:04.953 に答える