簡體   English   中英

如何使導航屬性正常工作?

[英]How do I get Navigation Properties working?

我有以下實體:

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; }
}

我在GasMeterPremise之間有1:1的關系。

我必須做什么,這樣我可以設置myPremise.GasMeter = myMeter和檢索myPremise在以后的代碼myMeter.Premise

編輯通過Fluent API進行設置時,如下所示:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Premise>().HasOptional(p => p.GasMeter)
            .WithRequired(m => m.Premise);
    }

運行時出現以下異常:

EntityFramework.dll中發生類型為'System.Data.Entity.ModelConfiguration.ModelValidationException'的異常,但未在用戶代碼中處理

附加信息:在模型生成期間檢測到一個或多個驗證錯誤:

前提:FromRole:NavigationProperty'前提'無效。 關聯類型'Premise_GasMeter'中FromRole'Premise_GasMeter_Target'的類型'GasMeter'必須與聲明了該NavigationProperty的類型'Meter'完全匹配。

這是否意味着我不能將導航屬性與繼承一起使用? 那我該如何解決我的問題呢?

我認為您需要為每個類別添加PK / FK關系的ID

public abstract class Meter
{
   ....
    public int PremiseId
    public virtual Premise Premise { get; set; }
}

public class Premise
{
   ....
   public int GasMeterId
   public virtual GasMeter GasMeter{ get; set; }
}

您可能不需要將這兩個實體彼此鏈接為虛擬屬性。 嘗試修改Meter類以保留PremiseId,因為它是Premise表的主鍵,然后使用Select(x => x.PremiseId == aMeter.PremiseId).SingleOrDefault()獲取Premise實體,以將Premise映射到此GasMeter

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM