我有一个Garage包含Cars和Motorcycles.汽车和摩托车是Vehicles.他们来了:
public class Garage
{
public int Id { get; set; }
public virtual List<Car> Cars { get; set; }
public virtual List<Motorcycle> Motorcycles { get; set; }
public Garage()
{
Cars = new List<Car>();
Motorcycles = new List<Motorcycle>();
}
}
public abstract class Vehicle
{
public int Id { get; set; }
public string Make { get; set; }
public string Model { get; set; }
}
public class Car : …Run Code Online (Sandbox Code Playgroud) 从EF6开始,在使用Table Per Hierarchy继承配置实体映射时,可以执行类似的操作:
public class MyContext : DbContext
{
public DbSet<Device> Devices { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ABatteryPoweredDevice>().Property(c => c.BatteryLevel).HasColumnName("BatteryLevel");
modelBuilder.Entity<ADifferentBatteryPoweredDevice>().Property(c => c.BatteryLevel).HasColumnName("BatteryLevel");
}
}
Run Code Online (Sandbox Code Playgroud)
BatteryLevel不是Device基类的一部分 - 它是为实现接口契约而实现的派生类的属性.
是否可以将此作为默认行为,而不是必须为每个派生类添加新映射?
使用实体框架(代码优先),我试图映射以下两个实体之间的条件/过滤关系:
构建
BuildingId
BuildingName
Area
AreaId
ParentId
AreaName
IsSubArea
一个建筑可以有许多地区
的区域可以有多个(次)地区
我想创建建筑和区域之间的关系,其中标有'IsSubArea'的区域被过滤掉.在此上下文中,ParentId将与Building相关,否则,ParentId将是另一个Area.这将允许我创建具有许多区域的建筑物,并且每个区域可以具有许多子区域,从而创建树形结构.
与我发现的解决方案最接近的是"软删除"功能(来源):
modelBuilder.Entity<Foo>().Map(m => m.Requires("IsDeleted").HasValue(false));
Run Code Online (Sandbox Code Playgroud)
转换为适合我的例子:
modelBuilder.Entity<Area>().Map(m => m.Requires("IsSubArea").HasValue(false));
Run Code Online (Sandbox Code Playgroud)
但据我所知,这与建筑物的关系无关.
另一种解决方案是在Building上创建一个属性,该属性指定用于返回相关区域的查询定义(源):
public class Building
{
public int BuildingId {get; set;}
public string BuildingName {get; set;}
public IQueryable<Area> BuildingAreas
{
get
{
return from area in areas
where area.IsSubArea == false
and area.ParentId == BuildingId
select area;
//Assume I have …Run Code Online (Sandbox Code Playgroud)