EF6 Interceptor在Insert或Update上设置值

时间:2014-10-27 15:47:10

标签: c# .net entity-framework-6

我在尝试弄清楚如何使用EF6拦截器在插入/更新上设置值时遇到了麻烦。

我想做的是让一个拦截器自动创建Audit的新实例,如下所示:

public class FooContext : DbContext
{
    public DbSet<Invoice> Invoices { get; set; }
    public DbSet<Audit> Audits { get; set; }
}

public class Invoice
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Audit AuditAndConcurrencyKey { get; set; }
}

public class InvoiceItem
{
    public int Id { get; set; }
    public Invoice Header { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }

    //For legacy reasons. I know this design is wrong :(
    public Audit AuditAndConcurrencyKey { get; set; }
}

public class Audit
{
    public int Id { get; set; }
    public int InstanceId { get; set; }
    public string Message { get; set; }
}

[Test]
public void WillCreateAudit()
{
    using (var db = new FooContext())
    {
        var inv = new Invoice {Name = "Foo Invoice"};
        var invLine = new InvoiceItem {Header = inv, Price = 1, Name = "Apple"};
        db.Invoices.Add(inv);
        db.SaveChanges();


        //Inceptors should figure out that we are working with "Invoice" and "InvoiceLine"
        //And automatically create an "Audit" instance
        Assert.That(inv.AuditAndConcurrencyKey != null);
        Assert.That(invLine.AuditAndConcurrencyKey != null);
        Assert.That(inv.AuditAndConcurrencyKey == invLine.AuditAndConcurrencyKey)
    }
}

我检查的第一件事是SoftDeleteInterceptor public class AuditInterceptor { public void Intercept(object obj) { if (!(obj is Invoice) && !(obj is InvoiceItem)) return; //not type we are looking for, by-pass //Set the audit here } } 。我不认为这是我想要的,因为看起来我们已经在生成表达式树,我们不再知道你正在使用的对象的类型。

我也检查了this example,但同样,看起来我们正在注入字符串而不是设置对象引用。

理想情况下,我想要这样的事情:

{{1}}

0 个答案:

没有答案