Сначала используйте код CTP5 EF4 без каскадного удаления - PullRequest
2 голосов
/ 16 февраля 2011

Сначала я использую код, а отключил каскадное удаление для всех внешних ключей, используя следующую инструкцию:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
}

У меня есть два класса Invoice и InvoiceLine

public class Invoice : ITrackable
{       
    [Key]
    public Guid Id { get; set; }

    public virtual ICollection<InvoiceLine> InvoiceLines { get; set; }

    //other properties
}

public class InvoiceLine : ITrackable
{       
    [Key]
    public Guid Id { get; set; }

    public Guid InvoiceId { get; set; }

    [ForeignKey("InvoiceId")]
    public virtual Invoice Invoice { get; set; }

    //other properties
}

Проблема возникает, когда я хочу удалить счет-фактуру и все связанные с ней строки счета-фактуры. Работает следующий код:

public IQueryable<Invoice> SelectAllInvoices(params Expression<Func<Invoice, object>>[] includes)
{
    DbQuery<Invoice> result = this.DataContext.Invoices;

    foreach (var include in includes)
    {
        result = result.Include(include);
    }

        return result;
}

public Invoice SelectInvoiceById(Guid id, params Expression<Func<Invoice, object>>[] includes)
{
    return this.SelectAllInvoices(includes).FirstOrDefault(invoice => invoice.Id == id);
}

public void DeleteInvoice(Guid id)
{
    var invoice = this.SelectInvoiceById(id, i => i.InvoiceLines);

    for (int index = 0; index < invoice.InvoiceLines.Count; index++)
    {
        var line = invoice.InvoiceLines.ElementAt(index);

        this.DataContext.DeleteObject(line);
        this.DataContext.SaveChanges();
    }

    this.DataContext.Invoices.Remove(invoice);
    this.DataContext.SaveChanges();
}

но когда я удаляю действие SaveChanges в цикле for, оно не работает.

Почему я должен выполнять промежуточные SaveChanges? * И почему я должен вызывать метод DeleteObject для invoicelines, а не для удаления? *

1 Ответ

0 голосов
/ 17 февраля 2011

попробуйте

public void DeleteInvoice(Guid id) {
    var invoice = this.SelectInvoiceById(id, i => i.InvoiceLines);

    foreach(var line in invoice.InvoiceLines) {
        this.DataContext.InvoiceLine.Remove(line);
    }

    this.DataContext.Invoices.Remove(invoice)
    this.DataContext.SaveChanges();
}
...