将一个实体对象的基类属性复制到第二个实体对象,该对象继承自与第一个实体对象相同的基类

时间:2017-06-10 13:49:22

标签: c# entity-framework inheritance

让我们考虑以下几个类:

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但我也不知道它是否是解决问题的好方法。 我想用最简单的方法解决问题。我愿意接受任何建议。欢呼声。

0 个答案:

没有答案