【问题标题】:Entity and N-Tier architecture in C#C# 中的实体和 N 层架构
【发布时间】:2010-05-19 17:17:47
【问题描述】:

我有如下三张表

Emp
----
empID int 
empName
deptID


empDetails
-----------
empDetailsID int
empID int

empDocuments
--------------
docID
empID
docName
docType

我正在创建一个实体类,以便我可以使用 n 层架构在 C# 中执行数据库事务等。我开始为如下所示创建类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace employee
{
    class emp
    {
        private int empID;
        private string  empName;
        private int deptID;

        public int EmpID { get; set; }
        public string EmpName { get; set; }
        public int deptID { get; set; }

    }
}

我的问题是 empDetails 和 empDocuments 通过 empID 与 emp 相关。我如何在我的 emp 类中拥有这些。

如果您能指导我举个例子,我将不胜感激。

谢谢

【问题讨论】:

    标签: c# n-tier-architecture


    【解决方案1】:

    我建议您阅读三篇非常好的文章,以帮助您走上正确的道路:

    http://msdn.microsoft.com/en-us/magazine/dd882522.aspx

    http://msdn.microsoft.com/en-us/magazine/ee321569.aspx

    http://msdn.microsoft.com/en-us/magazine/ee335715.aspx

    它们基于 EF4 解决方案,但我认为即使您不使用 EF4 甚至 LINQ,它们仍可能非常相关。尤其是前两篇。写的很好。

    就您的具体问题而言,您似乎需要为 empDetails 和 empDocuments 创建一个实体类,然后在 emp 类型的 empDetails 中保存一个属性和一个 empDocuments 的集合(任何 IEnumerable)。但可以肯定的是,您可以使用某种预构建的框架来帮助您。我认为可能会有 EF Oracle 实现。

    【讨论】:

      【解决方案2】:

      包含外键的表通常代表更大实体的详细信息。

      EmpDetailsEmpDocuments 都代表您的更大实体 Emp 的不同详细程度。

      由于每个Emp 实例可能有许多文档和许多详细信息,因此您的详细信息表应作为emp 类中的列表收集。

      public class emp {
          public int Id { get; set; }
          public string Name { get; set; }
          public int DepartmentId { get; set; }
          public IList<empDetail> Details { 
              get {
                  return _details;
              }
          }
          private IList<empDetail> _details;
          public IList<empDocument> Documents {
              get {
                  return _documents;
              }
          }
          private IList<empDocument> _documents;
      }
      

      使用NHibernate,您可以根本不关心您的数据库关系模型,并让此工具通过XML 映射文件(Follow this link for an overview) 使用您的类图中的SchemaExportTool 自动生成您的数据库关系模式。

      NHibernate 有多个插件,如果我们可以这样称呼它们,例如Fluent NHibernate (FNH)Linq to NHibernate

      这里有一些有用的链接可以帮助您熟悉它:

      1. NHibernate Reference Documentation
      2. Basic O/R mapping
      3. ISessionFactory Configuration
      4. 说到架构:NHibernate Architecture
      5. Collection Mapping --> 对于在 emp 实体类中映射两个 empDetailempDocument 集合非常有用。
      6. A Nice Tutorial

      使用 NHibernate 的几个优点:

      1. 再也不用为设计关系模型而烦恼了;
      2. 不用担心底层数据存储,NHibernate 通过简单的 XML 配置文件支持多个数据库引擎(无需为任何底层数据库重新编译应用程序);
      3. 一旦您掌握了 NHibernate,您的开发速度就会轻松地从 25% 提高到 50% 或更多;

      否则,还有 Microsoft Enterprise Library 我经常与 NHibernate 一起使用,或者根据项目,我可能更喜欢仅将 EntLib 与不同的应用程序块一起使用:

      1. Data Access Application Block;
      2. Exception Handling Application Block;
      3. Logging Application Block;
      4. Security Application Block;
      5. Unity Application Block;

      我可能会忘记其他一些...

      【讨论】:

        【解决方案3】:

        你玩过 Linq2SQL 吗?您可以在那里找到答案。

        【讨论】:

        • 谢谢。我确实使用过 LinQtoSQL,但由于一些奇怪的公司政策和数据库是 oracle,我不能在这个项目中使用 LinQ。
        • 还有其他处理数据库和实体的框架,如hibernate、subsonic、实体框架等。你可以阅读一些关于它们的文章,看看它们是如何处理你的情况的。毕竟,最终,您将找到一些解决方案,通过现有框架解决您的问题。
        【解决方案4】:

        如果您使用LINQ to Entities,您应该能够从 Oracle 数据源创建实体。这比自己做要容易得多。

        【讨论】:

          猜你喜欢
          • 2012-03-04
          • 1970-01-01
          • 2012-12-17
          • 2023-03-27
          • 1970-01-01
          • 2013-02-24
          • 2011-10-09
          • 1970-01-01
          • 2013-10-12
          相关资源
          最近更新 更多