使用TPH在Base类中插入数据时,判别器为NUll

时间:2016-03-08 21:25:24

标签: c# entity-framework entity-framework-6 table-per-hierarchy tph

我有一张桌子大师

  • 编号
  • 标签
  • 文本
  • 鉴别

其中的数据就像

    <table>
        <tr>
            <td>Id</td>
            <td>Tag</td>
            <td>Text</td>
            <td>Discriminartor</td>
        </tr>
        <tr>
            <td>1</td>
            <td>20</td>
            <td>"test1"</td>
            <td>Field20</td>
        </tr>
        <tr>
            <td>2</td>
            <td>21</td>
            <td>"test1"</td>
            <td>Field21</td>
        </tr>
        <tr>
            <td>3</td>
            <td>22</td>
            <td>"test1"</td>
            <td>Field22</td>
        </tr>
    </table>

在我的模型课中,我有课

 public class Master
{    public int Id{ get; set; }     
     public string Tag{ get; set;} 
     public string Text { get; set; }
}

我有Field20,Field21和Field22的类,如下所示

    public class Field20 : Master
{     public Field20()
    {
        Tag= "20";
        Text= "Sender's Reference";
    }
}
   public class Field21 : Master
{     public Field21()
    {
        Tag= "21";
        Text= "Sender's Reference";
    }
}
   public class Field22 : Master
{     public Field22()
    {
        Tag= "22";
        Text= "Sender's Reference";
    }
}

在映射中我有

modelBuilder.Configurations.Add(new MasterMap());
   modelBuilder.Entity<Master>()
            .Map<Field20>(p =>   p.Requires("Discriminator").HasValue("Field20"))
         .Map<Field21>(p => p.Requires("Discriminator").HasValue("Field21"))
        .Map<Field22>(p => p.Requires("Discriminator").HasValue("Field22"))

现在当我试图为像

这样的高手增加价值时
          var fields = new Master(){Tag= "22", Text = "123.1"}
          _context.Master.Add(fields)
         _context.savechanges()

我正在

无法将值NULL插入列&#39; Discriminator&#39;,table&#39; Master&#39 ;;列不允许空值。 INSERT失败。 声明已经终止。

1 个答案:

答案 0 :(得分:0)

这一行...

var fields = new Master(){Tag= "22", Text = "123.1"};

...创建一个没有定义鉴别器的对象,因为它不是一个子类型。您应该创建一个子类型:

var field = new Field20(){Tag= "22", Text = "123.1"};

为了帮助您不创建错误的对象,请将Master设为抽象类。