扩展System.Data.Linq.DataContext

时间:2009-06-17 12:22:36

标签: c# asp.net-mvc linq linq-to-sql

我有一个反映我的dbml文件的类,它扩展了DataContext,但由于一些奇怪的原因,它告诉我

  

System.Data.Linq.DataContext'不包含带'0'参数的构造函数“

我已经遵循了各种教程并且没有遇到过这个问题,VS似乎无法修复它。

这是我的实施

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Linq;
using System.Data.Linq.Mapping;
using System.Reflection;
using System.Text;
using IntranetMvcAreas.Areas.Accounts.Models;

namespace IntranetMvcAreas
{
  partial class ContractsControlDataContext : DataContext
  {
    [FunctionAttribute(Name="dbo.procCC_Contract_Select")]
    [ResultType(typeof(Contract))]
    [ResultType(typeof(ContractCostCentre))]
    [ResultType(typeof(tblCC_Contract_Data_Terminal))]
    [ResultType(typeof(tblCC_CDT_Data_Service))]
    [ResultType(typeof(tblCC_Data_Service))]
    public IMultipleResults procCC_Contract_Select(
        [Parameter(Name = "ContractID", DbType = "Int")] System.Nullable<int> ContractID,
        [Parameter(Name = "ResponsibilityKey", DbType = "Int")] System.Nullable<int> ResponsibilityKey,
        [Parameter(Name = "ExpenseType", DbType = "Char")] System.Nullable<char> ExpenseType,
        [Parameter(Name = "SupplierID", DbType = "Int")] System.Nullable<int> SupplierID)
    {

      IExecuteResult result = this.ExecuteMethodCall(this, (MethodInfo)(MethodInfo.GetCurrentMethod()), ContractID, ResponsibilityKey, ExpenseType, SupplierID);
      return (IMultipleResults)result.ReturnValue;
    }
  }
}

ContractsControlDataContext指的是问题

(顺便说一下,这与我最近发表的一篇文章没有任何关系,只是我正在做同样的事情)

修改

这可能值得澄清,所以请仔细阅读。

如果在部分类中扩展DataContext,则无法访问ExecuteMethodCall

  

'Intranet.ContractsControlDataContext'不包含'ExecuteMethodCall'的定义,并且没有可以找到接受类型'Intranet.ContractsControlDataContext'的第一个参数的扩展方法'ExecuteMethodCall'(您是否缺少using指令或程序集引用? )

也许我错过了一些非常愚蠢的东西?

解决

我想也许Visual Studio在这里挣扎,但我完全依赖于自动生成的代码。当右键单击数据库建模语言设计视图并点击“查看代码”时,它会在特定命名空间中自动为您创建一个部分类,但是,这个命名空间是错误的。如果有人能为我澄清这一点,我将非常感激。

.designer.cs文件位于namespace Intranet.Areas.Accounts.Models,但.cs文件(部分类生成 .designer.cs文件 Visual Studio )在namespace Intranet。很容易找到比我更有经验的人。

现在真正的问题是,我的答案是否正确?因为你们中许多人为找到这个问题做出了贡献。

5 个答案:

答案 0 :(得分:6)

linq的对象DataContext没有空构造函数。由于它没有空构造函数,因此必须传递除了基础之外的其中一个项目。

从DataContext的MetaData。

// Summary:
//     Initializes a new instance of the System.Data.Linq.DataContext class by referencing
//     the connection used by the .NET Framework.
//
// Parameters:
//   connection:
//     The connection used by the .NET Framework.
public DataContext(IDbConnection connection);
//
// Summary:
//     Initializes a new instance of the System.Data.Linq.DataContext class by referencing
//     a file source.
//
// Parameters:
//   fileOrServerOrConnection:
//     This argument can be any one of the following: The name of a file where a
//     SQL Server Express database resides.  The name of a server where a database
//     is present. In this case the provider uses the default database for a user.
//      A complete connection string. LINQ to SQL just passes the string to the
//     provider without modification.
public DataContext(string fileOrServerOrConnection);
//
// Summary:
//     Initializes a new instance of the System.Data.Linq.DataContext class by referencing
//     a connection and a mapping source.
//
// Parameters:
//   connection:
//     The connection used by the .NET Framework.
//
//   mapping:
//     The System.Data.Linq.Mapping.MappingSource.
public DataContext(IDbConnection connection, MappingSource mapping);
//
// Summary:
//     Initializes a new instance of the System.Data.Linq.DataContext class by referencing
//     a file source and a mapping source.
//
// Parameters:
//   fileOrServerOrConnection:
//     This argument can be any one of the following: The name of a file where a
//     SQL Server Express database resides.  The name of a server where a database
//     is present. In this case the provider uses the default database for a user.
//      A complete connection string. LINQ to SQL just passes the string to the
//     provider without modification.
//
//   mapping:
//     The System.Data.Linq.Mapping.MappingSource.
public DataContext(string fileOrServerOrConnection, MappingSource mapping);

这样简单的东西可行。从DataConext继承的任何类必须至少将其中一种类型传递给基础构造函数。

public class SomeClass : System.Data.Linq.DataContext
{
    public SomeClass(string connectionString)
        :base(connectionString)
    {

    }
}

答案 1 :(得分:5)

假设命名空间和(数据上下文)类型名称正确...首先仔细检查。

听起来我觉得codegen失败了,所以你只有你的一半的数据上下文(不是IDE想要提供的一半)。 LINQ-to-SQL中存在一个已知错误,如果(如在您的情况下)using声明位于命名空间之上,则可能会失败。不,我不是在开玩笑。尝试更改代码:

namespace IntranetMvcAreas
{
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Linq;
    using System.Data.Linq.Mapping;
    using System.Reflection;
    using System.Text;
    using IntranetMvcAreas.Areas.Accounts.Models;
    // the rest of your code

现在进入设计器,调整一些东西(例如,更改属性的名称并再次更改它)并点击保存(这会强制执行codegen)。现在看看它是否有效。

答案 2 :(得分:2)

David Basarab的答案是正确的,应该标记为答案。

您的类未提供任何构造函数,因此提供了默认构造函数。仅当基类具有无参数构造函数时,才能提供派生类的默认构造函数。但是,作为此示例中的基类的DataContext类不提供无参数构造函数。这解释了编译器返回给您的错误消息。

修改

示例:

class A {
    public A(string s) {
    }
}

class B : A {
}

尝试编译会在B类中返回错误:

  

'A'不包含带'0'参数的构造函数

答案 3 :(得分:1)

生成器关于构造函数的行为在某种程度上由DBML的Connection属性控制。如果“应用程序设置”为True,并且存在设置属性名称,则它将生成一个构造函数,该构造函数从程序集的“应用程序设置”中读取连接字符串。 如果存在连接字符串,它将在.designer.cs文件中生成带有硬编码连接字符串的构造函数。 如果两者都没有,它将不会生成没有连接字符串参数的构造函数,并且您可以在部分类中安全地提供无参数构造函数而不会导致冲突。

这些设置更改不能在数据库中从架构中往返,但我只是在更改之后和保存DBML之前清除属性中的连接设置。

答案 4 :(得分:0)

@Sander:我认为你走在了正确的轨道上。我没有使用部分类并为sproc实现函数,而是使用this blog并使用* .designer.cs文件来实现它。虽然我仍然遇到无效类型转换的问题,但它确实摆脱了原来的问题。