实体框架对继承感到困惑,返回子类而不是超类

时间:2017-11-02 23:09:02

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

我添加了 Audit 版本的实体,这些实体是具有少量额外列的单独表格。

我在EF中定义了这些

[Table("PERSON")]
class Person {...} // regular properties
[Table("PERSON_AUDIT")]
class PersonAudit : Person, IAudit { ... } // additional audit properties

public virtual DbSet<Person> Persons { get; set; }
public virtual DbSet<PersonAudit> PersonAudits { get; set; }
找到一些意想不到的行为

    // querying table PERSON. this method should have nothing to do with PERSON_AUDIT
    public Person GetPerson(int personId)
    {
        using (var db = new Context())
        {

            db.Persons.Take(5).ToList(); // queries PERSON_AUDIT table! 

            db.Persons.Find(personId); // EXCEPTION: "sequence contains more than one element" because it queries PERSON_AUDIT table and returns multiple  

            db.Persons.Where(x => x.PersonId == personId).ToList(); // queries / returns multiple PersonAudit objects

        }
    }

所以电线越过某个地方,所有的查询都是PERSON_AUDIT而不是PERSON

1 个答案:

答案 0 :(得分:0)

由于PersonAuditPerson的子类,查询后者会返回Person的实例,包括前者。

为避免这种情况,请同时继承一个共同的abstract基数,例如PersonBase