У меня есть таблица МастерДискриминатора утратившего при вставке данных в базовом классе с использованием 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 терпит неудачу. Заявление было прекращено.
Спасибо за ответ, но я знаю, что он будет работать именно так. В моем сценарии я не знаю, какое поле мне нужно сохранить. Это может быть либо Field20, 21, либо 22. Поэтому я хочу что-то вроде того, как я упомянул выше. – user3182464
Тогда я бы не реализовал это как наследование. Просто установите поле типа в коде и действуйте по его значению. Нет другого способа создать подтип, чем явно создавать его в некотором типизированном виде. Часто наследование не является лучшим образцом. Существуют другие поведенческие модели, основанные на композиции, а не наследовании (это старая дискуссия). –
Единственной альтернативой является создание соответствующего подтипа в операторе 'switch' и' Add' в '' Master' DbSet. –