Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架包括导航属性中具有特定值的记录_C#_Entity Framework_Ef Code First_Fluent - Fatal编程技术网

C# 实体框架包括导航属性中具有特定值的记录

C# 实体框架包括导航属性中具有特定值的记录,c#,entity-framework,ef-code-first,fluent,C#,Entity Framework,Ef Code First,Fluent,我首先使用EntityFramework6代码,并使用FluentAPI配置域模型的映射。我不知道如何为有点棘手的表创建导航属性。 我有几个可以制造噪音的物体,我想在噪音记录表中记录这些噪音 public class NoiseRecord { public int RecordID {get; set;} public INoisy NoiseOrigine {get; set;} public double NoiseMagnitude {get; set;} }

我首先使用EntityFramework6代码,并使用FluentAPI配置域模型的映射。我不知道如何为有点棘手的表创建导航属性。 我有几个可以制造噪音的物体,我想在噪音记录表中记录这些噪音

public class NoiseRecord
{
    public int RecordID {get; set;}
    public INoisy NoiseOrigine {get; set;}
    public double NoiseMagnitude {get; set;}
}
我需要某种条件映射,比如:

modelBuilder.Entity<NoiseRecord>().HasRequired(n=>n.Origine.OrigineType()=="Car").WithMany(c=>c.NoiseRecords);
我正在寻找一种通过fluentapi实现这一点的方法


谢谢大家!

首先,不能将接口用作导航属性。但是可以使用抽象基类作为噪声源

public abstract class NoiseOrigin
{
    public NoiseOrigin()
    {
        this.NoiseRecords = new Collection<NoiseRecord>();
    }

    public int Id { get; set; }

    public ICollection<NoiseRecord> NoiseRecords { get; set; }
}

public class Car : NoiseOrigin {}

public class Plane : NoiseOrigin { }

public class NoiseRecord
{
    public int Id { get; set; }

    public int OriginId { get; set; }
    public NoiseOrigin Origin { get; set; }

    public double NoiseMagnitude { get; set; }
}
公共抽象类NoiseOrigin
{
公共噪音来源()
{
this.NoiseRecords=新集合();
}
公共int Id{get;set;}
公共ICollection NoiseRecords{get;set;}
}
公车:噪音来源{}
公共类平面:NoiseOrigin{}
公共类噪音记录
{
公共int Id{get;set;}
public int OriginId{get;set;}
公共噪声源{get;set;}
公共双噪声量{get;set;}
}
您的fluent API映射将如下所示

public class NoiseModelContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Car>().Map(p => p.Requires("Type").HasValue("Car"));
        modelBuilder.Entity<Plane>().Map(p => p.Requires("Type").HasValue("Plane"));
    }

    public DbSet<NoiseOrigin> NoiseOrigins { get; set; }

    public DbSet<NoiseRecord> NoiseRecords { get; set; }
}
public类NoiseModelContext:DbContext
{
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity().Map(p=>p.Requires(“Type”).HasValue(“Car”);
modelBuilder.Entity().Map(p=>p.Requires(“Type”).HasValue(“Plane”);
}
公共DbSet NoiseOrigins{get;set;}
公共数据库集噪音记录{get;set;}
}
要获取所有汽车噪音记录,您的查询如下

using (var db = new NoiseModelContext()) {
    var records = db.NoiseRecords.Where(p => p.Origin is Car);
    // or like this - the result is the same.
    var records2 = db.NoiseOrigins.OfType<Car>().SelectMany(p => p.NoiseRecords);
}
使用(var db=new NoiseModelContext()){
var记录=db.NoiseRecords.其中(p=>p.原点为Car);
//或者像这样-结果是一样的。
var records2=db.NoiseOrigins.OfType().SelectMany(p=>p.NoiseRecords);
}

非常感谢您的帮助,我非常感谢。您的解决方案的问题是,我的目标是自动“预加载”导航属性。我希望避免手动填充我的汽车/飞机的NoiseRecords属性。因此,对于您的解决方案,实际上有一些我不理解的地方,如果您必须使用Datacontext请求获取记录,那么映射的意义是什么?如果我必须写一个额外的请求,那么我会把抽象类扔掉,因为我不会用它赢得任何东西。在实体框架中,fluent API只能用于定义概念模型如何映射到数据库。无法自动预加载导航属性。您可以使用LazyLoading按需加载导航属性,也可以使用Earge loading在查询中包含导航属性的值。var result=db.NoiseOrigins.OfType().Include(p=>p.NoiseRecords)和抽象基类NoiseOrigin允许您的模型通过使用TablePerHierarchy继承映射在同一数据库表中持久化平面和汽车。但更重要的是,与接口相比,可以使用基类作为导航属性。line modelBuilder.Entity().Map(p=>p.Requires(“Type”).HasValue(“Car”);简单地说,类Car映射到与基类NoiseOrigin相同的表,但需要列类型保存字符串值“Car”,以便将其标识为Car类型的对象。
using (var db = new NoiseModelContext()) {
    var records = db.NoiseRecords.Where(p => p.Origin is Car);
    // or like this - the result is the same.
    var records2 = db.NoiseOrigins.OfType<Car>().SelectMany(p => p.NoiseRecords);
}