如何在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?
}
}
}
答案 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