В простой модели с простой структурой наследования TPH я не могу понять, как правильно создать новую легкую сущность дочернего типа.
Например:
public class Vehicle
{
public string Name { get; set; }
public byte VehicleType { get; set; }
}
public class Car : Vehicle
{
// Some extra properties
}
Дискриминатор не следует стандартному подходу Entity Framework с использованием строкового значения для определения родителя класса, поэтому мы используем некоторый EF FluentAPI для изменения метаданных:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Vehicle>()
.Map<Car>(m => m.Requires("VehicleType").HasValue((byte)1));
}
Поведение по умолчанию из приведенного ниже кода, похоже, создает подходящую сущность в Breeze, но значение дискриминатора никогда не устанавливается, поэтому сохранение изменений на сервере приводит к сохранению объекта типа Vehicle вместо Car.
var group = breezeManager.createEntity("Car", {
Name: 'My car'
// If the line below is omitted, VehicleType is saved
// to the server with a value of 0
,VehicleType: 1
});
breezeManager.saveChanges();
Хотя это, похоже, вопрос о поведении клиентского компонента Breeze, может быть уместно, что мы используем Breeze для хранения в базе данных, к которой нет доступа через Entity Framework (мы просто генерируем метаданные EF для Breeze, чтобы потреблять).
Я не думаю, что клиентский код должен беспокоиться о реализации наших дискриминаторов наследования, поэтому, надеюсь, есть альтернатива ручной установке значения при создании каждого объекта.
Как лучше всего правильно сохранить значение дискриминатора?
1 ответ
Мне удалось убедиться, что TPH со значением байтового дискриминатора работает. Единственная разница, которую я замечаю между моей моделью и вашей, заключается в том, что я не указал свойство байта в своей.
public abstract class Airplane
{
public int Id { get; set; }
public string Name { get; set; }
//public byte AirplaneType { get; set; } //Not required
}
public class Boeing : Airplane
{
public string Model { get; set; }
}
Указания дискриминатора в Fluent API было достаточно, чтобы EF сохранил правильное значение.
Новые вопросы
breeze
Breeze - это библиотека JavaScript, которая помогает управлять данными в многофункциональном клиентском приложении. Вы можете запрашивать и сохранять данные в виде сложных графов объектов, а также обмениваться этими графиками на нескольких экранах вашего JavaScript-клиента.