从部分类c#

时间:2015-06-30 07:57:59

标签: c# .net entity-framework inheritance

考虑以下情况,

我有由DB First方法创建的实体,

// auto-generated class
public partial DBEntity : DBContext
{
   public DBEntity ()
        : base("name=DBEntity ") // gets connection string from api.config
    {
    }
}

我有时需要构建并传递连接字符串,所以我创建了这个,

public partial class DBEntity 
{
    public DBEntity (String connectionString)
    {
        if (string.IsNullOrEmpty(connectionString))
            new DBEntity ();
        else
            base(connectionString); // this one fails
    }
}

的最佳方法是什么?
  1. 如果连接字符串为空,则调用无参数实体构造函数?
  2. 如果conn string不为空,则从参数化构造函数中调用基础构造函数,并实现下面的操作,
  3. public DBEntity (String connectionString) : base (connectionString)

    我将永远做new DBEntity(string)

4 个答案:

答案 0 :(得分:4)

您无法更改在构造函数中创建的对象的引用。换句话说,当你调用构造函数时,对象在内存中初始化,你只需要设置它。

相反,您应该使用静态方法来控制返回类型。您可以将其放在另一个类DbEntityFactory中,然后致电DbEntityFactory.Create或将其放入DbEntity课程并致电DbEntity.Create

public static DBEntity Create(String connectionString)
{
    if (string.IsNullOrWhiteSpace(connectionString)) //use this instead of IsNullOrEmpty
        return new DBEntity();
    else
        return new DBEntity(connectionString); 
}

答案 1 :(得分:0)

您无法延迟对基础构造函数的调用。基本构造函数始终首先触发。这是为了防止你有一个半初始化的类。

我认为如果要将调用偏离基类,我应该创建两个构造函数。或者,如dotctor所述:创建一个工厂类。如果这样做可能取决于使用泛型和初始化那些泛型类型的实例的需要。

答案 2 :(得分:0)

目前您允许null或空字符串作为connectionString的值,我认为这是错误的。

如果要使用具有参数connectionString的构造函数,则具有以提供有效值。如果你这样做,那么整个问题就会消失,因为那个构造函数不再具有二元性了。

答案 3 :(得分:-1)

遵循"在构造函数"中没有逻辑的简单规则,我将提供两个构造函数 - 一个有一个,一个没有参数。