如何在EF6上的不同继承类上为不同属性创建可选的必需项(businnes required rules)

时间:2015-07-29 23:29:17

标签: entity-framework asp.net-mvc-4 entity-framework-6

如何在EF6上的不同继承类上为相同的属性创建可选的REQUIRED。

为什么其他孩子需要一个孩子的'必需属性'? 如果基类是非必需属性,为什么实体框架将所有数据anotations合并到base classe'Perso'?

我在MVC上使用了相同的类来在cshtml上创建必需的字段,并且它可以工作。 MVC只理解来自一个孩子的必填字段,而不是与这两个子类别进行任何“错误合并”。

例如:

//EF Codefirst Class
public class Person
{
    [Key]
    public int key{get;set;}
    [StringLength(500)]
    public virtual string name { get; set; }
    [StringLength(500)]
    public virtual string email{ get; set; }
    [StringLength(500)]
    public virtual string phone{ get; set; }
    [StringLength(500)]
    public virtual string address{ get; set; }
    [StringLength(500)]
    public virtual string manager{ get; set; }
    [StringLength(500)]
    public virtual string Discriminator{ get; set; }
}
//My Inherited classes
public class Employee : Person
{
    [Required]
    public override string name{ get; set; }
    [Required]
    public override string phone{ get; set; }
    [Required]
    public override string manager{ get; set; }
} 
public class Manager: Person
{
    [Required]
    public override string name{ get; set; }
    [Required]
    public override string email{ get; set; }
}
//And my sample function 'Add PersonManager' 
 private void  InsertPerson()
 {
    using (var ctx = new MyDataContext())
    {
        try
        {
            var m = new Manager() ;
            m.name = "my name" ;
            m.email = "my@email.com";
            m.address =" something";

            ctx.Person.Add(m);        

            ctx.SaveChanges();  
        }
        catch (Exception ex)
        {
         // Why, if I try to Add my Person 'Manager', the attribute : phone and manager is REQUIRED?
        }        
    }
}

1 个答案:

答案 0 :(得分:1)

这是因为您正在使用TPH策略。所有实体都将合并到一个表中,EF处理必须为null或不为null的内容。

如果您使用TPT策略,EF将为每个实体创建不同的表。要了解有关继承策略的更多信息,请查看此链接http://blogs.msdn.com/b/alexj/archive/2009/04/15/tip-12-choosing-an-inheritance-strategy.aspx

要使用TPT而不是TPH,您必须在子类中定义“键”,如下所示:

public class Employee : Person
{
    [Key]
    public int employeeId;
    [Required]
    public override string name;
    [Required]
    public override string phone;
    [Required]
    public override string manager;
} 

另一种方法是使用Fluent API。像这样:

modelBuilder.Entity<Person>() 
    .HasKey(c => c.key); 

modelBuilder.Entity<Employee>()
   .ToTable("Employees");

modelBuilder.Entity<Manager>()
   .ToTable("Managers");

要了解有关详情,请查看此链接https://msdn.microsoft.com/en-us/data/jj591617.aspx#2.5