强制EF 5或6映射接口成员

本文关键字:映射 接口 成员 EF 强制 | 更新日期: 2023-09-27 18:20:15

问题非常简单直接:我必须做什么才能使EF(5或6)根据以下代码创建数据库

class Program
{
    static void Main(string[] args)
    {
        Person parent = new ResponsablePerson();
        parent.Name = "Father";
        Person child = new Person();
        child.Name = "Child";
        child.Parent = parent;
        using (PersonContext pc = new PersonContext())
        {
            pc.Persons.Add(parent);
            pc.Persons.Add(child);
            pc.SaveChanges();
        }
        Console.ReadKey();
    }
}
public class Person : IPerson
{
    [Key]
    public string Name { get; set; }
    public IPerson Parent { get; set; }
    public virtual void Work()
    {
        Console.WriteLine("How much are you payng me? Ok I'll do it!");
    }
}
public class ResponsablePerson : Person
{
    public override void Work()
    {
        Console.WriteLine("Right Now!");
    }
}
public class NotResponsablePerson : Person
{
    public override void Work()
    {
        Console.WriteLine("Oh HELL NO!");
    }
}
public interface IPerson
{
    string Name { get; set; }
    IPerson Parent { get; set; }
    void Work();
}

问题是EF创建的数据库只包含一列人名。。。

强制EF 5或6映射接口成员

public class Person : IPerson 
{
    public virtual Parent Parent { get; set; }
    IParent IPerson.Parent
    {
       get { return this.Parent; }
       set
       {
          if (!(value is Parent)) throw new ArgumentException();
          this.Parent = (Parent)value;
       }
    }
}

正如您所看到的,诀窍是有两个属性,一个是使EF工作(返回类型为Parent),另一个是满足接口(返回类型是IPparent)。这个技巧可以通过显式的方式实现接口。