我Foo
在实体框架中有一个实体.但我正在使它继承,IFoo
以便我的业务逻辑只知道IFoo
- 从而抽象出实体框架.
问题是Foo
有一组Bar
实体.而这个系列是类型的EntityCollection
.
如果我按IFoo
原样放入此集合,我IFoo
依赖于Entity Framework.所以我想把它作为ICollection
,但这不编译(自然).
我能想到的唯一的解决办法就是去具体的Foo
实体框架设计器生成的执行情况和更改收集EntityCollection
到ICollection
那里.但我担心这会对"幕后"的实体框架产生影响.
有没有什么办法让我可以定义IFoo
并IBar
独立于实体框架,同时仍然维护Foo
和Bar
实现它们的EF实体?做IFoo
和IBar
甚至是有意义的,如果我不能做到这一点的独立性,我什么为目标?
您所指的一般概念是"持久性无知"(PI),尽管这通常直接应用于实体本身而不是消耗实体的代码.
无论如何,Hibernate和NHibernate原生支持PI,但微软实体框架的初始版本却没有.MS为此抓住了很多优势,PI可能是下一个版本中讨论最多的第一个功能(无论何时).
至于你试图用接口做什么,在检索后需要修改Bars的集合吗?如果答案是肯定的,那就没有简单的答案.甚至协方差也无法帮助你,因为ICollection
有一个Add方法.
如果集合是只读的,那么您可以考虑将其公开为IEnumerable
.该Enumerable.Cast
方法使这相当方便.
interface IFoo { IEnumerableBars { get; } } partial class Foo : IFoo { IEnumerable IFoo.Bars { get { return Bars.Cast (); } } }
此外,我知道至少有一项努力使当前版本的EF支持持久性无知.