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)提供方法的对象.
我从未使用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)