我有一个场景,我有两个不同的类,它们基本上代表同一个对象。
我有一个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。
答案 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的两个实例之间传输数据。