C# 实体框架包括导航属性中具有特定值的记录
我首先使用EntityFramework6代码,并使用FluentAPI配置域模型的映射。我不知道如何为有点棘手的表创建导航属性。 我有几个可以制造噪音的物体,我想在噪音记录表中记录这些噪音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;} }
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);
}