Also, das ist eine Art eine stumpfe Frage, aber lassen Sie mich sehen, ob ich es relativ einfach auslegen kann. Können sagen, ich die folgende Schnittstelle habe:Implementierung einer ICollection <ISomething> mit einem konkreten Typ Entity Framework zu erfüllen
public interface IFoo
{
ICollection<IBar> Bars { get; set; }
}
die mit mir dann implementieren:
public class Foo : IFoo
{
public virtual ICollection<IBar> Bars { get; set; }
}
Nur Entity Framework kann nicht mit Schnittstellen arbeiten, so dass es ignoriert ziemlich vollständig diese Navigations Eigenschaft. Um sie zu erkennen EF zu bekommen, muss ich es ändern:
public virtual ICollection<Bar> Bars { get; set; }
Wo Bar
würde meine Implementierung von IBar
sein. Nur, das kann die Schnittstelle nicht implementieren, die IBar
nicht Bar
will. Jetzt
, betrachten ein etwas anderes Szenario, wo ich nur einen grundlegenden Fremdschlüssel bekam:
public interface IFoo
{
IBar Bar { get; set; }
}
public class Foo : IFoo
{
public virtual IBar Bar { get; set; }
}
gleiches Problem, aber hier kann ich es löst durch Zugabe:
public class Foo : IFoo
{
public virtual Bar Bar { get; set; }
IBar IFoo.Bar
{
get { return Bar; }
set { Bar = (Bar)value; }
}
}
EF ist glücklich, weil es einen konkreten Typ hat und die Schnittstelle ist glücklich, weil es eine Implementierung mit IBar
hat. Das Problem ist, dass ich nicht herausfinden kann, wie man dieselbe Logik mit einem ICollection<IBar>
anwendet, weil (ICollection<Bar>)value
eine Ausnahme mit der Aufschrift "Kann Typ ICollection<Bar>
zu ICollection<IBar>
nicht implizit konvertieren" nicht auslösen kann.
Wie soll ich die Besetzung richtig machen?
UPDATE
Also, ich zahle nicht nahe genug, um die Aufmerksamkeit auf, wo der Fehler erzeugt wurde. Es beschwerte sich tatsächlich über das get { return Bars; }
Bit. Ich konnte durch die Fehler loszuwerden Ändern Sie es an:
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; }
}
}
dass, obwohl ein wenig kitschig mir scheint, wie ich nur die Fehlermaskierung und eine kleine Zeitbombe für mich zu schaffen. Ich würde mich über irgendwelche Gedanken oder alternativen Lösungen freuen.
tun: Was ist Ihre Situation, in der Sie dies tun müssten ? – IronMan84
Ich habe eine Entität, die eine Schnittstelle implementiert, die nur auf andere Schnittstellen verweist, nicht auf konkrete Typen. –
Funktioniert Ihr Getter und Setter tatsächlich?Ich würde erwarten, dass eine "InvalidCastException" für mindestens einige gültige Sammlungsinstanzen ausgelöst wird. – hvd