gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:53:02 25 4
gpt4 key购买 nike

我无法理解如何使用 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
}

像属性一样公开实体的字段感觉很尴尬,因为我要重新映射。对于列表类型,情况更糟,因为我必须编写一个“添加”和“删除”方法以及一个公开列表的属性。

在上面的 BookType setter 示例中,我需要访问 BookTypeEntity 对象,我可以通过使用 BookType 对象的 ID 实例化一个新对象来获取该对象。这也感觉不太好。

我想知道我是否不应该只扩展 BookEntity 对象并在其中添加我的业务逻辑?或者可能使用部分?

在 LLGLGen 示例中,他们直接使用实体对象,但这对我来说看起来很困惑。在上面的代码中,我希望对象也可以具有用于我的业务逻辑(如 CountPages)的方法。

最佳答案

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

看起来效果不错。如果你没有从你的 ORM 中获取部分类,我会创建一个 Facade,它用你的业务逻辑包装你的数据对象......这样两者就分开了,你可以重新生成一个而不会覆盖另一个。

更新

分部类支持在分部类的一个声明中而不是另一个声明中实现接口(interface)。如果你想实现一个接口(interface),你可以在你的自定义代码部分文件中实现它。

直接来自 MSDN :

partial class Earth : Planet, IRotate { }
partial class Earth : IRevolve { }

等同于

class Earth : Planet, IRotate, IRevolve { }

关于c# - 应该扩展还是封装 ORM 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1038084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com