Расширение System.Data.Linq.DataContext
У меня есть класс, отражающий мой файл 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" и не может быть найден метод расширения "ExecuteMethodCall", принимающий первый аргумент типа "Intranet.ContractsControlDataContext" (вам не хватает директивы using или ссылки на сборку? )
Может, мне не хватает чего-то невероятно глупого?
решаемые
Я думаю, возможно, Visual Studio боролся здесь, но я полностью полагался на автоматически сгенерированный код. При щелчке правой кнопкой мыши на представлении дизайна языка моделирования базы данных и нажатии "Просмотр кода" он автоматически создает для вас частичный класс в пределах определенного пространства имен, однако это пространство имен было неправильным. Если бы кто-то мог прояснить это для меня, я был бы очень благодарен.
Файл .designer.cs находится в namespace Intranet.Areas.Accounts.Models
, однако файл .cs(частичный класс, сгенерированный для.designer.cs файла от Visual Studio), был в namespace Intranet
. Легко найти для кого-то более опытного в этой области, чем я.
Реальная проблема теперь в том, кто отвечает, что я считаю правильным? Потому что многие из вас способствовали обнаружению этой проблемы.
Ответы
Ответ 1
Объект DataContext для linq не имеет пустого конструктора. Поскольку у него нет пустого конструктора, вы должны передать один из элементов, кроме базы.
Из метаданных для DataContext.
// 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)
{
}
}
Ответ 2
Я предполагаю, что имя типа пространства имен и (data-context) правильное... дважды проверьте это.
Мне кажется, что 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
Теперь зайдите в конструктор, настройте что-нибудь (например, измените имя свойства и измените его снова) и нажмите "Сохранить" (это заставляет кодировать). Теперь посмотрим, работает ли он.
Ответ 3
Давид Басараб отвечает правильно и должен быть отмечен как ответ.
Ваш класс не предоставляет никакого конструктора, поэтому предоставляется конструктор по умолчанию. Конструкторы по умолчанию для производных классов могут быть предоставлены только в том случае, если базовый класс имеет конструктор без параметров. Однако класс DataContext, который является вашим базовым классом в этом примере, не предоставляет конструктор без параметров. Это объясняет сообщение об ошибке, которое возвращается компилятору.
Edit
Пример:
class A {
public A(string s) {
}
}
class B : A {
}
Попытка скомпилировать, которая возвращает ошибку в классе B:
"A" не содержит конструктор, который принимает аргументы "0"
Ответ 4
Поведение генератора относительно конструкторов в некоторой степени контролируется свойствами Connection DBML. Если параметры приложения "Истина" и есть имя свойства параметров, он будет генерировать конструктор, который считывает строку соединения из настроек приложения сборки.
Если есть строка соединения, она сгенерирует конструктор со строкой жесткого соединения в файле .designer.cs.
Если их нет, он не будет генерировать конструктор без параметра строки подключения, и вы можете безопасно предоставить конструктор без параметров в частичном классе, не вызывая конфликта.
Эти изменения настроек не выходят за пределы схемы схемы из базы данных, но я просто очищаю настройки соединения от свойств после внесения изменений и до того, как я сохраню DBML.
Ответ 5
@Sander: Я думаю, вы были на правильном пути. Вместо использования частичного класса и реализации функции для sproc я вместо этого следовал этот блог и использовал файл *.designer.cs для его реализации, Хотя я все еще испытываю проблемы с недопустимым типом, он избавился от исходной проблемы.