В простой модели с простой структурой наследования 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
Luckyrat 2 Апр 2014 в 15:36

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 сохранил правильное значение.

3
DenisK 12 Апр 2014 в 02:20
Спасибо. Не осознавал, что это необязательно, но все отлично работает без этого, как вы предлагаете.
 – 
Luckyrat
14 Апр 2014 в 14:11