0

我正在尝试设置 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;
        }
    }
}
4

1 回答 1

0

您真的想要/需要两个独立的模型,即您的数据访问层模型 (edmx) 和您的“真实”域模型吗?像 EF 这样的 ORM 框架的全部意义在于,您可以使用物理(数据库)概念模型之间的映射将域模型映射到数据库表。

从 EF4.1 开始,您可以构建域模型,然后在数据访问层中使用流式 API 直接将其映射到数据库。如果您想快速启动运行,您还可以选择从数据库中对 POCO 域模型进行逆向工程。

创建整个 EF 类模型似乎有点不必要的复杂性,然后必须再次将其映射到另一个类模型(这很可能与 EF 生成的模型相当接近)。

于 2012-10-03T21:29:45.937 回答