[英]Using a stored procedure in entity framework, how do I get the entity to have its navigation properties populated?
[英]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; }
}
我在GasMeter
和Premise
之間有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.