在具有简单TPH继承结构的breeze模型中,我无法弄清楚如何正确创建子类型的新breeze实体。
例如:
public class Vehicle
{
public string Name { get; set; }
public byte VehicleType { get; set; }
}
public class Car : Vehicle
{
// Some extra properties
}
鉴别器不遵循使用字符串值来确定类父级的标准实体框架方法,因此我们使用一些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消费)。
我不认为客户端代码应该担心继承鉴别器的实现,所以希望在创建每个对象时可以手动设置值。
正确存储鉴别器值的最佳方法是什么?
答案 0 :(得分:3)
我能够验证具有字节鉴别值的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保存正确的值。