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

时间:2016-02-08 19:21:53

标签: c# entity-framework constructor primary-key

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

目前,在项目中,所有数据访问级别对象都由部分类中的方法初始化。所以它是创建的,全面使用空值,然后我们在其上调用自定义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的构造函数,以及带有主键的构造函数......似乎无法找到我确定的明显答案...

1 个答案:

答案 0 :(得分:2)

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

假设您想使用不同的存储库(比如说平面文件进行测试)。如果您的存储库访问被绑定到构造函数中,则您必须具有基于某些外部触发器选择存储库的复杂逻辑,或者使用不同的签名,因为您不能拥有具有相同签名的多个构造函数。

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

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`
}