【问题标题】:CTP5 POCO Code-Only, how to add master-detail records to DBCTP5 POCO Code-Only,如何将主从记录添加到数据库
【发布时间】:2011-06-17 07:37:15
【问题描述】:

我正在尝试 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

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

【问题讨论】:

    标签: entity-framework-4 poco code-first entity-framework-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();      
    }
    

    虽然所有这些都有效,但我建议始终在类构造函数中初始化导航属性的集合,这样您就不需要每次都在客户端代码中执行此操作,也不会在运行时间:

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

    【讨论】:

    • 我看到我可以做到,但是我尝试使用它的方式呢,不可能吗?这是使用 CTP5 和 POCO 仅代码方法处理此类场景的方法吗?
    • 我会尝试通过列表,看看它是否有效,感谢您的帮助。
    • 好的,创建列表并添加项目会将子记录保存到db。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    相关资源
    最近更新 更多