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 <== 此时为空,所以我不能在发票本身的实例中添加一行我应该创建 InvoiceLines 的集合并设置它,还是有其他方法可以做到这一点。

简而言之,我如何使用 POCO 代码 (CTP5) 将主/明细行添加到我的数据库中。

4

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 回答