通过构造函数使用主键初始化 EF(6) 对象 (最佳实践?

本文关键字:对象 最佳 EF 构造函数 初始化 | 更新日期: 2023-09-27 18:33:40

我整天都在谷歌上搜索这个问题,但没有找到答案。 这似乎是一个如此简单的话题,它会在某个地方,但也许我搜索错了......但如果这是重复的,请原谅我...

目前,在项目中,所有数据访问级别对象都由分部类中的方法初始化。 所以它被创建,全面使用 null 值,然后我们在其上调用自定义 get 方法,其中包含以下一些变体:

public MyObject GetMyObjectByID(int myPrimaryKey) 
{
    using (var db = new myContext())
    {
        MyObject myObject = new MyObject();
        myObject = db.MyObjects.Find(myObject.primaryKey = myPrimaryKey);
        return myObject;
    }
}

。并将创建的 MyObject 分配给初始对象。

这样就行了...但似乎很多跑来跑去。 如果 find() 如此简单,并且从主键工作得如此流畅,那么难道不应该有一种方法可以将其放入构造函数中吗?只需使用 创建对象

MyObject myObject = New MyObject(MyPrimaryKey);
就像我说的,

我整个早上都在谷歌上搜索它,寻找 ef6 的构造函数,以及带有主键的构造函数......似乎找不到我确定的显而易见的答案...

通过构造函数使用主键初始化 EF(6) 对象 (最佳实践?

不将该逻辑放入构造函数的主要原因是因为该类与存储库耦合。 通过将创建逻辑保留在类本身之外,可以将类与存储机制分离。

假设您想使用不同的存储库(例如用于测试的平面文件)。 如果您的存储库访问权限已烘焙到构造函数中,则必须具有复杂的逻辑才能根据某些外部触发器选择存储库,或者使用不同的签名,因为不能有多个具有相同签名的构造函数。

另外,考虑一下该构造函数的外观:

public MyObject (int pk)
{
   db = // get repository
   // can't say "this = ...", so we have to create a temporary object and copy.
   MyObject temp = db.MyObjects.Find(myObject.primaryKey = myPrimaryKey);
   // copy properties of `temp` to `this`
}