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_Navigation Properties - Fatal编程技术网

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();