我有一个反映我的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
。很容易找到比我更有经验的人。
现在真正的问题是,我的答案是否正确?因为你们中许多人为找到这个问题做出了贡献。
答案 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)