C# 如何使导航属性正常工作?
我拥有以下实体:C# 如何使导航属性正常工作?,c#,entity-framework,navigation-properties,C#,Entity Framework,Navigation Properties,我拥有以下实体: public abstract class Meter { public int MeterId { get; set; } public string EANNumber { get; set; } public string MeterNumber { get; set; } [Required] public virtual Premise Premise { get; set; } public abstract void
public abstract class Meter
{
public int MeterId { get; set; }
public string EANNumber { get; set; }
public string MeterNumber { get; set; }
[Required]
public virtual Premise Premise { get; set; }
public abstract void AddReading(CounterReading reading);
}
public class GasMeter : Meter
{
public virtual Counter Counter { get; private set; }
public override void AddReading(CounterReading reading)
{
Counter.Readings.Add(reading);
}
}
public class Premise
{
[Key]
public int PremiseId { get; set; }
public string Title { get; set; }
public string Description { get; set; }
[Required]
public virtual Address Address { get; set; }
public string Type { get; set; }
public virtual GasMeter GasMeter { get; set; }
}
我在煤气表
和前提
之间有一个1:1的关系
我必须做什么才能设置myPremise.GasMeter=myMeter
,并在以后的代码中使用myMeter.Premise
检索myPremise
编辑
通过Fluent API进行设置时,如下所示:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Premise>().HasOptional(p => p.GasMeter)
.WithRequired(m => m.Premise);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().has可选(p=>p.GasMeter)
.WithRequired(m=>m.Premise);
}
我在运行时遇到以下异常:
EntityFramework.dll中出现“System.Data.Entity.ModelConfiguration.ModelValidationException”类型的异常,但未在用户代码中处理
其他信息:在模型生成过程中检测到一个或多个验证错误:
前提:FromRole:NavigationProperty“前提”无效。关联类型“Premise\u GasMeter”中FromRole“Premise\u GasMeter\u Target”的类型“GasMeter”必须与声明此导航属性的类型“Meter”完全匹配
这是否意味着我不能将导航属性与继承一起使用?
那么我该如何解决我的问题呢?我认为您需要为PK/FK关系的每个类添加Id
public abstract class Meter
{
....
public int PremiseId
public virtual Premise Premise { get; set; }
}
及
您可能不需要将这两个实体作为虚拟属性相互链接。尝试修改Meter类以保留PremiseId,因为它是前提表的主键,然后使用
Select(x=>x.PremiseId==aMeter.PremiseId).SingleOrDefault()
获取映射到此煤气表的前提实体
public abstract class Meter
{
public int MeterId { get; set; }
public string EANNumber { get; set; }
public string MeterNumber { get; set; }
public int PremiseId { get; set; }
public abstract void AddReading(CounterReading reading);
}
设置
得到
var thePremise=\u repository.Set.Select(x=>x.PremiseId==aMeter.PremiseId.SingleOrDefault();
将前提添加到仪表后,仍然看不到前提上的仪表。即使有你的建议。像这样使用它也会破坏导航属性的意义。请看:@GertArnold请查看我的更新。public virtual Premise{get;set;}
应该在煤气表中
或公共虚拟煤气表煤气表
应该是公共虚拟煤气表
@GertArnold是的,我把前提放在煤气表中了。我的房子里有多个仪表(煤气表、水表、电表),我希望保持那里的类型安全。@GertArnold在我的仪表上放置房屋
属性会使我的仪表出错。EF不再自动增加MeterId。
public abstract class Meter
{
public int MeterId { get; set; }
public string EANNumber { get; set; }
public string MeterNumber { get; set; }
public int PremiseId { get; set; }
public abstract void AddReading(CounterReading reading);
}
var aPremise = new Premise();
var aMeter = new GasMeter();
aPremise.GasMeter = aMeter;
aMeter.PremiseId = aPremise.PremiseId;
var thePremise = _repository.Set<Premise>.Select(x => x.PremiseId == aMeter.PremiseId).SingleOrDefault();