如何在不显式设置每个属性的情况下加载Entity Framework数据对象

时间:2017-07-31 15:34:53

标签: c# entity-framework

我希望能够执行以下操作:

<div className="carousel__viewport" ref={r => this.viewport = r}>

我遇到的问题是我无法弄清楚是否有一种简单的方法可以将数据加载到使用Entity Framework生成的对象中。我理解如何获取填充对象所需的信息,但有没有一种简单的方法来填写对象的所有属性,而无需显式遍历每个属性并将其设置为所需的值?在C#中,我不能简单地输入:

var book = new Book();
book.LoadByPrimaryKey(id); //returns bool

我必须明确设置每个属性:

this = db.Books.Single(d => d.BookId == id);

在想要加载对象时有没有办法解决这个问题?也许有DbDataReader的东西?我已经使用数据读取器加载DataTables,但无法弄清楚如何使用它们来填充对象。也许我在想它。

2 个答案:

答案 0 :(得分:1)

当您需要将所有属性从一个对象复制到另一个对象时,您可以

  1. 只需编写代码(打字练习)
  2. 使用T4 Template
  3. 生成代码
  4. 使用Reflection
  5. 使用Automapper

答案 1 :(得分:0)

以前为David Browne answered

  1. 只需编写代码(打字练习)
  2. 使用T4 Template
  3. 生成代码
  4. 使用Reflection
  5. 使用Automapper
  6. 他给你的答案是正确的。但是我想扩展它并解释原因。

    首先,我们在这里提出一些概念。当我们进一步研究编程技术时,有时,工作的答案,还不够。虽然您尝试做的是该问题的有效解决方案,但它存在一些问题。

    这是一个名为S.O.L.I.D.的概念。第一个字母(S)代表单一责任原则。这意味着一个对象应该只有一个责任。

    您的方法中的问题是您将多个职责放在一个对象中:

    1. 保留/传输有关图书的信息。
    2. 从远程服务器(在本例中为DataBase)加载有关图书的信息。
    3. 你可能在发布此帖之前搜索了这个问题,我怀疑你没有发现任何有用的东西。现在你找不到任何东西的原因是因为这是一个糟糕的方法,它违背了SOLID概念,并且它打破了与可能的Design Patterns的几个交互。所以这就是为什么你可能什么都没找到,没有以前设想的解决这个问题的工具,因为这是一种沮丧的方法,所以没有人,对程序技术有一点了解,会帮助你。

      因此,我们回到David Browne给你的答案。使用Automapper(最简单的建议)。你需要改变你的方法。考虑将不同类别中的每项责任分开:

      class BookDA // DAO = data access
      {
          private MyDbConnection db;
      
          public BookTO Get()
          {
              var book = db.Books.Single(d => d.BookId == id);
      
              return book;
          }
      }
      
      class BookTO // TO = transport object
      {
          public string Name { get; set; }
      }
      

      在上面的代码中,每个职责都与不同的职业相关联。这个答案变得太长了,但我希望它有所帮助。

相关问题