是应该扩展还是封装ORM对象?

Rob*_*ssa 3 .net c# oop orm llblgenpro

我无法理解如何使用ORM生成的对象.我们使用LLBLGen将数据库模型映射到对象.我们将这些对象封装在代表我们业务模型的另一层中(我认为).

也许这段代码会更好地解释这一点.

public class Book { // The class as used in our application
    private BookEntity book;      // LLBLGen entity
    private BookType bookType;    // BookType is another class that wraps an entity

    public Book(int Id) {
        book = new BookEntity(Id);
    }

    public BookType BookType {
        get { return this.bookType; }
        set { 
            this.bookType = value; 
            this.book.BookType = new BookTypeEntity(value.ID);
            this.book.Save();
        }
    }

    public int CountPages() { }  // Example business method
}
Run Code Online (Sandbox Code Playgroud)

暴露实体的字段就像属性一样,感觉很尴尬,因为我重新映射了一遍.对于列表类型,它甚至更糟,因为我必须编写一个"添加"和"删除"方法以及一个公开List的属性.

在BookType setter中的上述示例中,我需要访问BookTypeEntity对象,我可以通过使用BookType对象的ID实例化一个新对象来获取此对象.这也感觉不舒服.

我想知道我是不是应该只扩展BookEntity对象并在那里添加我的业务逻辑?或者也许使用部分?

在LLGLGen示例中,他们直接使用实体对象,但这看起来非常混乱.我想在上面的代码中拥有可以为我的业务逻辑(如CountPages)提供方法的对象.

Jus*_*ner 5

我从未使用LLBLGen进行映射,但我使用的大多数ORM工具都会生成部分类.然后我添加任何自定义代码/逻辑,我想在一个单独的文件中添加到这些对象(因此如果重新生成部分类,它们不会被覆盖).

似乎工作得很好.如果你没有从你的ORM中获得部分类,我会创建一个Facade,它将你的数据对象与你的业务逻辑包装在一起......这样两者是分开的,你可以重新生成一个而不会覆盖另一个.

UPDATE

部分类支持在一个部分类的声明中实现接口而不支持另一个.如果要实现接口,可以在自定义代码部分文件中实现它.

直接来自MSDN:

partial class Earth : Planet, IRotate { }
partial class Earth : IRevolve { }
Run Code Online (Sandbox Code Playgroud)

等同于

class Earth : Planet, IRotate, IRevolve { }
Run Code Online (Sandbox Code Playgroud)