为EntityFramework继承使用不同的类

时间:2014-07-25 17:00:21

标签: c# entity-framework inheritance attributes

我有一个场景,我有两个不同的类,它们基本上代表同一个对象。

我有一个ContactPerson和ContactDetails。 ContactPerson是一个EntityObject,ContactDetails继承自ContactPerson,但添加了自己的属性。基本上我希望ContactDetails继承所有ContactPerson属性,添加其属性然后可插入到EF模型中。

尝试

我将所有ContactPerson属性设为虚拟,然后EF将其解释为更改跟踪。我也试过制作一个抽象类,然后ContactPerson从那里继承。那么有什么样的场景是最好的方法,但避免使用样板代码。

public class ContactPerson
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public virtual int Id { get; set; }
    public virtual string Title { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    // etc...
}

public class ContactDetails : ContactPerson
{
    [ElementText("textView_4")]
    public override string Title { get; set; }

    [ElementText("textView_6")]
    public override string AcademicTitle { get; set; }

    [ElementText("firstname")]
    public override string FirstName { get; set; }

    [ElementText("lastname")]
    public override string LastName { get; set; }
}

修改

有关更多背景信息,ContactDetails来自不同的数据源,这两个对象都驻留在不同的项目中。我使用这种方法来抓取网站并将信息插入EF。

1 个答案:

答案 0 :(得分:0)

如果要覆盖ContactDetails中的所有属性,则应该创建一个接口,而不是使用ContactPerson作为基类。

public interface IContact
{
    string Title { get; set; }
    string FirstName { get; set; }
    string LastName { get; set; }
    // etc...
}

然后在两个类上实现它:

public class ContactPerson : IContact
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public virtual int Id { get; set; }
    public virtual string Title { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    // etc...
}

public class ContactDetails : IContact
{
    [ElementText("textView_4")]
    public string Title { get; set; }

    [ElementText("textView_6")]
    public string AcademicTitle { get; set; }

    [ElementText("firstname")]
    public string FirstName { get; set; }

    [ElementText("lastname")]
    public string LastName { get; set; }
}

这将为您提供编译时检查,确保在每个类上实现所有属性。

然后,您可以使用自动映射器(https://github.com/AutoMapper/AutoMapper/wiki/Getting-started)等工具轻松地在IContact的两个实例之间传输数据。