0

У меня есть таблица МастерДискриминатора утратившего при вставке данных в базовом классе с использованием TPH

  • Id
  • Tag
  • Текст
  • дискриминатор

данные в нем, как

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

В Mapping у меня есть

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 в столбец «Дискриминатор», стол «Мастер»; столбец не допускает нулей. INSERT терпит неудачу. Заявление было прекращено.

ответ

0

Эта линия ...

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

... создает объект, для которого не определено ни дискриминатор, потому что это не является подтипом. Вы должны создать подтип вместо:

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

Чтобы помочь вам не создать неправильные объекты, сделать Master абстрактный класс.

+0

Спасибо за ответ, но я знаю, что он будет работать именно так. В моем сценарии я не знаю, какое поле мне нужно сохранить. Это может быть либо Field20, 21, либо 22. Поэтому я хочу что-то вроде того, как я упомянул выше. – user3182464

+0

Тогда я бы не реализовал это как наследование. Просто установите поле типа в коде и действуйте по его значению. Нет другого способа создать подтип, чем явно создавать его в некотором типизированном виде. Часто наследование не является лучшим образцом. Существуют другие поведенческие модели, основанные на композиции, а не наследовании (это старая дискуссия). –

+0

Единственной альтернативой является создание соответствующего подтипа в операторе 'switch' и' Add' в '' Master' DbSet. –

Смежные вопросы