通过覆盖属性进行继承映射

时间:2012-06-28 14:42:34

标签: c# .net entity-framework entity-framework-4 ef-code-first

我有以下代码。

public class Person
{
    public string LastName { get; set; }
}

public class Employee : Person
{        
}

使用配置

Map(p => p.MapInheritedProperties());
Property(p => p.LastName).HasMaxLength(100).IsRequired();

并希望将其更改为

public class Person
{
        public virtual string LastName {get; set;}
}

public class Employee : Person
{
    public override string LastName
    {
       get { return base.LastName; }
       set 
       {
             //add validation here or throw exception
             base.LastName = value;
       }
    }
}

如果我运行应用程序,则表示模型已更改。 好吧,我添加了一个数据库迁移,但它有错误:

  

属性'LastName'不是'Employee'类型的声明属性。

     

使用

验证是否未从模型中明确排除该属性      

忽略方法或NotMappedAttribute数据注释。确保它是有效的原始属性。

我需要添加哪种映射才能实现此功能? 我使用EF 4.3 with Migrations。

感谢任何提示。

2 个答案:

答案 0 :(得分:1)

这似乎是EF-属性的限制,可以在基类或子类上,但不能同时在两者上。见How to share common column names in a Table per Hierarchy (TPH) mapping

答案 1 :(得分:1)

你可以解决这个问题:

public class Person
{
    protected virtual void ValidateLastName() { }

    public string LastName
    {
       get { return lastName; }
       set 
       {
             ValidateLastName();
             lastName = value;
       }
    }
}

public class Employee : Person
{
    protected override void ValidateLastName()
    {
        // your validation logic here
    }
}