简体   繁体   中英

Discriminator as NUll when insert Data in Base class using TPH

I have a table Master

  • Id
  • Tag
  • Text
  • Discriminator

Data in it is like

    <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>

In my model class I have class

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

and I have Classes for Field20, Field21 and Field22 as below

    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";
    }
}

In Mapping I have

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"))

Now when i am trying to add value to master like

          var fields = new Master(){Tag= "22", Text = "123.1"}
          _context.Master.Add(fields)
         _context.savechanges()

I am getting

Cannot insert the value NULL into column 'Discriminator', table 'Master'; column does not allow nulls. INSERT fails. The statement has been terminated.

This line...

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

...creates an object for which no discriminator is defined, because it's not a subtype. You should create a subtype instead:

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

To help you not create the wrong objects, make Master an abstract class.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM