我正在尝试设置 EF 以在 WCF 上工作并保持域类模型 EF 不可知。
代码被组织成 3 个项目。(我正在尝试 DDD - 我对它很陌生,但期待学习更多)
项目:QA - 领域层。包含 DataContract 模型/实体。 参考 QA.数据 项目:QA.Data - 数据层。包含上下文和 EDMX(代码生成策略 = "none") 参考 实体框架/System.Data.Entity 项目:QA.Repository - 数据访问/存储库。包含存储库类 参考 QA [领域层] QA.Data [数据层] 实体框架/System.DataEntity
我的理解是域层可以引用数据层,但数据层不应该引用域。这提出的问题是我的域模型/类是在域层中定义的,但创建和返回它们的上下文是在数据层中。为了让我的上下文知道返回一个“Widget”对象,它需要一个对定义“Widget”的域层的引用
我的(失败的)解决方案:我的解决方案是为每个领域模型创建接口并将它们放置在数据层中。上下文将返回... IdbSet ...这些接口又将由域模型实现,因此使我的数据层无需直接引用我的域(这无论如何都会导致非法循环引用)。域模型最初是使用“ADO.NET DbContext Generator w/WCF Support”T4 模板构建的。此过程导致在小部件类定义的开头包含 [KnownType(typeof(IWidgetPiece))]。(一个 Widget 有一个导航属性 ...ICollection ...)
当我尝试访问服务时出现问题,我收到以下错误
无法将“QA.Data.IWidgetPiece”添加到已知类型列表中,因为已经存在具有相同数据协定名称“http://www.w3.org/2001/XMLSchema:anyType”的另一种类型“System.Object”。如果存在特定类型的不同集合 - 例如 List 和 Test[],则它们不能同时添加为已知类型。考虑仅指定其中一种类型以添加到已知类型列表中。
我可以将这些更改为具体的实现... [KnownType(typeof(WidgetPiece))] ...但我继续收到此错误,因为它们所指的导航属性仍在返回它必须执行的 IWidgetPiece 接口类型为了满足接口实现。
我试图弄清楚如何保持适当的划分,并且仍然让上下文返回它应该返回的内容。由于这个和其他原因,返回接口的上下文仍然不能与我“坐在一起”,但我想不出另一种方法来做到这一点,即使这也提出了上述问题。帮助!
一些代码希望能澄清我以前的杂乱无章......
namespace QA.Data
{
public interface IWidgetPiece
{
String ID { get; set; }
}
public interface IWidget
{
String ID { get; set; }
ICollection<IWidgetPiece> Pieces;
}
public partial class WidgetEntities : DbContext
{
IDbSet<IWidget> Widgets { get; set; }
IDbSet<IWidgetPiece> WidgetPieces { get; set; }
}
}
namespace QA
{
[KnownType(typeof(IWidgetPiece))]
// [KnownType(typeof(WidgetPiece))]
[DataContract(IsReference = true)]
public partial class Widget : QA.Data.IWidget
{
[DataMember]
public String ID { get; set; }
[DataMember]
public virtual ICollection<IWidgetPiece> Pieces { get; set; }
}
[DataContract(IsReference = true)]
public partial class WidgetPiece : QA.Data.IWidgetPiece
{
[DataMember]
public string ID { get; set; }
}
}
namespace QA.Repository
{
public class WidgetRepository
{
public List<Widget> GetWidgetbyID(String sId)
{
WidgetEntities context = new WidgetEntities();
List<IWidget> objs = context.Widgets.Where(b => b.ID == "78").ToList();
List<Widget> widgetList = new List<Widget>();
foreach (var iwidget in widgetList)
widgetList((Widget)iwidget);
return widgetList;
}
}
}