Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用TPH在基类中插入数据时鉴别器为NUll_C#_Entity Framework_Entity Framework 6_Table Per Hierarchy_Tph - Fatal编程技术网

C# 使用TPH在基类中插入数据时鉴别器为NUll

C# 使用TPH在基类中插入数据时鉴别器为NUll,c#,entity-framework,entity-framework-6,table-per-hierarchy,tph,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>

我有一个餐桌主人

  • 身份证
  • 标签
  • 正文
  • 鉴别器
其中的数据就像

    <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>
我为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"))
我越来越

无法将值NULL插入到“Discriminator”列、表“Master”中;列不允许空值。插入失败。 语句已终止。

此行

var fields = new Master(){Tag= "22", Text = "123.1"};
…创建未定义鉴别器的对象,因为它不是子类型。应改为创建子类型:

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

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

谢谢您的回复,但我知道它会这样工作。在我的场景中,我不知道要保存哪个字段。它可以是字段20、21或22中的任意一个。所以我想要像上面提到的那样的东西,那么我就不会把它作为继承来实现。只需在代码中设置一个类型字段并根据其值进行操作。除了以某种类型化的方式显式创建子类型之外,没有其他方法可以创建它。通常,继承并不是最好的模式。还有其他基于组合而非继承的行为模式(这是一个古老的争论)。唯一的替代方法是在
switch
语句中创建适当的子类型,然后
将其添加到
Master
DbSet。
var fields = new Master(){Tag= "22", Text = "123.1"};
var field = new Field20(){Tag= "22", Text = "123.1"};