【问题标题】:Using EF Model Entities in Winforms UI在 Winforms UI 中使用 EF 模型实体
【发布时间】:2015-08-14 11:28:49
【问题描述】:

我首先在测试项目中使用实体框架代码。我将代码分布在不同的层中,如下所示

模型层

这个层是所有其他层/项目的参考

namespace Model
{
   Public class Sample
   {
      Public string Name

      [ForeignKey("Category")]
      public int CatrgoryId

      Public Category Category
   }
} 

DAL

namespace DAL
{
   public class SampleContext:DbContext
   {
      ...
   }
}

在 DAL 中,我只有上下文类和迁移

BLL

namespace BLL
{
   public class SampleBLL
   {
       public List<Sample> GetAll()
       {
          retrn new SampleContext().Samples().ToList()
       }
   }
}

用户界面

namespace UI
{
   public class UIHelper
   {
      public List<Sample> GetSamples()
      {
         return new SampleBLL().GetAll();
      }

   }
}

在 UI 中使用 EF 实体模型对象似乎不切实际,因为它们可能具有导航属性并且不能直接绑定到像 DataGridView 这样的控件,因为在这种情况下,当我需要显示时,datagridview 将同时具有 CategoryId 和 Category 列类别名称为类别,例如DataGridView.DataSource = new SampleBLL().GetAll() 我能想到的一种解决方案是使用 ViewModel 类并手动将实体模型对象映射到 BLL 中的 viewmodel 对象并将 viewmodel 对象返回给 UI,但是,引入一个新层 ViewModel 将意味着复制我的所有模型对象并进行微小的更改。

例如上面示例模型的视图模型将

namespace Model
{
   Public class Sample
   {
      Public string Name

      public int CatrgoryId

      public string CategoryName
   }
} 

是我仅有的视图模型层选项,还是有其他有效的方法可以直接在 UI 中使用实体模型。

【问题讨论】:

    标签: c# entity-framework ef-code-first


    【解决方案1】:

    直接在 UI 中使用实体模型是一个非常糟糕的主意,主要是因为您暴露的问题。更重要的是,您目前只是检索数据并“按原样”显示它,但 UI 中最轻微的变化都会影响 DB,反之亦然。任何更复杂的逻辑都很难实现,AFAIK

    在工作中,我们使用 Transport 命名空间来存储与我们的实体相对应的类,并在完成检索逻辑后使用 assemblers 方法 将实体转换为传输类。通过这种方式,我们将模型与控制器分离,并且可以安全地操作数据,而不会有任何意外影响数据库的风险。

    【讨论】:

    • Tnx。因此,您建议使用 ViewModels(或传输类)将数据传入和传出 UI 到 BLL。这意味着在模型层和传输层中保持几乎相同的实体
    • 如果您使用的是 EntityFramework,您可能能够自动生成实体。是的,建议这样做。另外,您可以编写为视图准备好格式化自定义数据的传输类(如“ViewModel”所建议的),而不仅仅依赖于存储在数据库中的内容。
    猜你喜欢
    • 2021-07-28
    • 2011-07-04
    • 2011-04-27
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2015-02-06
    相关资源
    最近更新 更多