相关疑难解决方法(0)

具有每层次表的一对多实体框架为每个子类创建一个外键列

我有一个Garage包含CarsMotorcycles.汽车和摩托车是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)

c# entity-framework one-to-many table-per-hierarchy

10
推荐指数
2
解决办法
3390
查看次数

实体框架6和TPH继承:默认情况下,将具有相同名称的属性映射到同一列

从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基类的一部分 - 它是为实现接口契约而实现的派生类的属性.

是否可以将此作为默认行为,而不是必须为每个派生类添加新映射?

.net table-per-hierarchy entity-framework-6

8
推荐指数
1
解决办法
1454
查看次数

关系的条件映射

使用实体框架(代码优先),我试图映射以下两个实体之间的条件/过滤关系:

构建
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)

.net c# entity-framework ef-code-first entity-framework-5

5
推荐指数
1
解决办法
2681
查看次数