CTP5 POCO только для кода, как добавить основные записи в БД - PullRequest
1 голос
/ 28 января 2011

Я пробую 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 и установить ее, или есть другой способ сделать это. </p>

Короче говоря, как я могу добавить основные / подробные строки в свою базу данных, используя только код POCO (CTP5).

1 Ответ

1 голос
/ 28 января 2011

Вот один из способов сделать это:

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