1

我正在嘗試EF CTP5 POCO,並將其從EF4 EntityModel轉換爲POCO Code Only方法。CTP5 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 < ==在這一點空,所以我不能將行添加到發票本身 我應該創建InvoiceLines的集合,並將其設置的情況下,或者是有一些其他方式來做到這一點。

簡而言之,我如何使用POCO Code Only(CTP5)將主/明細行添加到我的數據庫中。

回答

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

我看到我可以做到這一點,但我試圖使用它的方式呢,這不可能嗎?這是使用CTP5和POCO Code Only方法處理這種情況的方法。 – hazimdikenli 2011-01-28 15:48:18

相關問題