所以,這是一個很遲鈍的問題,但讓我看看我是否可以相對簡單地佈置它。可以說我有以下接口:使用具體類型實現ICollection <ISomething>以滿足實體框架
public interface IFoo
{
ICollection<IBar> Bars { get; set; }
}
然後我與落實:
public class Foo : IFoo
{
public virtual ICollection<IBar> Bars { get; set; }
}
只有實體框架不能與接口的工作,所以它幾乎完全忽略了這個導航屬性。爲了獲得EF承認它,我需要將其更改爲:
public virtual ICollection<Bar> Bars { get; set; }
凡Bar
將是我實現IBar
。只是,這沒有實現接口,它要IBar
而不是Bar
。
現在,考慮一個稍微不同的情景,在那裏我剛剛拿到了一個基本的外鍵:
public interface IFoo
{
IBar Bar { get; set; }
}
public class Foo : IFoo
{
public virtual IBar Bar { get; set; }
}
同樣的問題,但在這裏,我可以通過添加解決它:
public class Foo : IFoo
{
public virtual Bar Bar { get; set; }
IBar IFoo.Bar
{
get { return Bar; }
set { Bar = (Bar)value; }
}
}
EF很高興,因爲它有一個具體的類型,並且界面很開心,因爲它具有IBar
的實現。問題在於我無法弄清楚如何將應用於相同的邏輯,因爲(ICollection<Bar>)value
引發了一個異常,說「無法將類型ICollection<Bar>
隱式轉換爲ICollection<IBar>
」。
我該如何正確地演員陣容?
UPDATE
所以,我並沒有給予足夠的重視正在產生錯誤的位置。它實際上是在抱怨get { return Bars; }
位。我可以通過它改變擺脫錯誤的:
public class Foo : IFoo
{
public virtual ICollection<Bar> Bars { get; set; }
ICollection<IBar> IFoo.Bars
{
get { return (ICollection<IBar>)Enumeration.Cast<IBar>(Bars); }
set { Bars = (ICollection<Bar>)value; }
}
}
這似乎有點做作我雖然喜歡我只是掩蓋錯誤,併爲自己創建一個小的定時炸彈。我會很感激任何想法或替代解決方案。
我很好奇:什麼是你的情況下,可能需要這樣做? – IronMan84
我有一個實體實現一個接口,只引用其他接口,而不是具體的類型。 –
你的吸氣和吸氣器是否真的有效?我期望至少有一些有效的集合實例會拋出一個InvalidCastException異常。 – hvd