gpt4 book ai didi

c# - 实现具有具体类型的 ICollection 以满足 Entity Framework

转载 作者:太空狗 更新时间:2023-10-29 23:39:12 36 4
gpt4 key购买 nike

所以,这是一个比较迟钝的问题,但让我看看我是否可以相对简单地列出它。假设我有以下界面:

public interface IFoo
{
ICollection<IBar> Bars { get; set; }
}

然后我用它来实现:

public class Foo : IFoo
{
public virtual ICollection<IBar> Bars { get; set; }
}

只有 Entity Framework 不能使用接口(interface),所以它几乎完全忽略了这个导航属性。为了让 EF 识别它,我需要将其更改为:

public virtual ICollection<Bar> Bars { get; set; }

在哪里Bar将是我对 IBar 的实现.只是,它无法实现需要 IBar 的接口(interface)不是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 很高兴,因为它有一个具体的类型,接口(interface)很高兴,因为它有一个 IBar 的实现。 .问题是我无法弄清楚如何对 ICollection<IBar> 应用相同的逻辑。因为(ICollection<Bar>)value引发异常,提示“无法将类型 ICollection<Bar> 隐式转换为 ICollection<IBar>”。

我应该如何正确地进行转换?

更新

因此,我没有足够密切地注意错误的产生位置。它实际上是在提示 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; }
}
}

虽然这对我来说似乎有点矫揉造作,就像我只是在掩盖错误并为自己制造一个小定时炸弹。如果有任何想法或替代解决方案,我将不胜感激。

最佳答案

为了让协变/逆变起作用,我在我的界面中将导航属性定义为可枚举:

public interface IFoo
{
IEnumerable<IBar> Bars { get; }
}

public class Foo : IFoo
{
public virtual ICollection<Bar> Bars { get; set; }
IEnumerable<IBar> IFoo.Bars
{
return this.Bars;
}
}

这对于基于接口(interface)类型构建的 EF LINQ 查询来说仍然足够了。

关于c# - 实现具有具体类型的 ICollection<ISomething> 以满足 Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20555028/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com