【问题标题】:Discriminator as NUll when insert Data in Base class using TPH使用 TPH 在基类中插入数据时鉴别器为 NUll
【发布时间】:2016-06-23 01:05:11
【问题描述】:

我有一张桌子主人

  • 身份证
  • 标签
  • 文字
  • 鉴别器

里面的数据是这样的

    <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 插入到列“鉴别器”、表“主”中;列不允许空值。插入失败。 声明已终止。

【问题讨论】:

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


    【解决方案1】:

    这一行...

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

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

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

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

    【讨论】:

    • 感谢您的回复,但我知道它会这样工作。在我的场景中,我不知道我必须保存哪个字段。它可以是 Field20、21 或 22 中的任何一个。所以我想要我上面提到的方式。
    • 那么我不会将其实现为继承。只需在代码中设置一个类型字段并对其值进行操作。除了以某种类型的方式显式创建子类型之外,没有其他方法可以创建子类型。通常,无论如何,继承并不是最好的模式。还有其他基于组合而不是继承的行为模式(这是一个古老的争论)。
    • 唯一的替代方法是在switch 语句中创建适当的子类型,并将Add 它添加到Master DbSet。
    猜你喜欢
    • 1970-01-01
    • 2014-11-21
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    相关资源
    最近更新 更多