【问题标题】:Calling Base entity constructor from partial class c#从部分类 c# 调用 Base 实体构造函数
【发布时间】:2015-09-16 22:04:26
【问题描述】:

考虑以下场景,

我有由 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 字符串不为空,则从参数化构造函数中调用基本构造函数并实现下面发生的情况,

public DBEntity (String connectionString) : base (connectionString)

我会一直做new DBEntity(string)

【问题讨论】:

  • new CareRecordEntities();的目的是什么?
  • @Patrick:抱歉打错了。我现在已经更正了。

标签: c# .net entity-framework inheritance


【解决方案1】:

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

我认为如果你想改变对基类的调用,你应该创建两个构造函数。或者,正如dotctor 提到的:创建一个工厂类。这是否可行可能取决于是否需要使用泛型并从这些泛型类型初始化实例。

【讨论】:

    【解决方案2】:

    您不能更改在构造函数中创建的对象的引用。换句话说,当您调用构造函数时,对象会在内存中初始化,而您只是对其进行设置。

    相反,您应该使用允许您控制返回类型的静态方法。你可以把它放在另一个类中,比如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); 
    }
    

    【讨论】:

    • 如此优雅的解决方案。希望我能多次投票:)非常感谢。工作完美。次要:第一个 return 缺少“new”关键字,否则我想缺少“return”关键字。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      如果您想使用带有参数connectionString 的构造函数,那么您必须提供一个有效值。如果你这样做,那么整个问题就会消失,因为构造函数不再具有对偶性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-05
        • 2014-02-19
        • 1970-01-01
        • 2019-02-01
        • 2018-05-25
        • 2012-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多