让我们考虑以下几个类:
public class BaseEntity
{
public BaseEntity()
{
Created = DateTime.Now;
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public virtual Guid Id { get; set; }
public virtual DateTime Created { get; set; }
[Required]
public virtual string Code { get; set; }
}
public interface IBaseHistory
{
string EntityName { get; set; }
string LoggedUserData { get; set; }
string ModificationType { get; set; }
string ExtraInfo { get; set; }
}
public abstract class OrderBase : BaseEntity
{
public string Prop1 { get; set; }
public string Prop2 { get; set; }
}
public class Order : OrderBase
{
public Order()
{
}
public virtual Client Owner { get; set; }
}
public class OrderHistory : OrderBase, IBaseHistory
{
public string EntityName { get; set; }
public string LoggedUserData { get; set; }
public string ModificationType { get; set; }
public string ExtraInfo { get; set; }
}
我在项目中使用代码优先方法。我想为我的模型中的每个实体创建历史实体。要做到这一点,我不得不使用以下方法: https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt 对于每个历史表,我还想添加一些额外的字段,例如: ModificationType或EntityName等。为了实现这个想法,我使用了IBaseHistory接口,如我在我的示例中所示。 问题是:如何将一个实体对象(Order实体的Prop1和Prop2)的基类属性复制到第二个实体对象(OrderHistory),该对象继承自与第一个实体对象(OrderBase)相同的基类? 我认为最简单的方法是使用构造函数,例如:
public class OrderHistory : OrderBase, IBaseHistory
{
public string EntityName { get; set; }
public string LoggedUserData { get; set; }
public string ModificationType { get; set; }
public string ExtraInfo { get; set; }
public OrderHistory()
{
}
public OrderHistory(OrderBase orderBase)
{
this.Prop1 = orderBase.Prop1;
this.Prop2 = orderBase.Prop2;
}
}
然后我可以很容易地做到:
Order order= new Order() {Prop1 = "val1", Prop2 = "val2"};
OrderHistory orderHistory = new OrderHistory(order);
如果我的实体有40个字段怎么办?在这种情况下,我必须添加40行代码,如果我忘记了一个字段怎么办?我想过使用AutoMapper但我也不知道它是否是解决问题的好方法。 我想用最简单的方法解决问题。我愿意接受任何建议。欢呼声。