Расширение 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. Легко определить для кого-то более опытного в этой области, чем я.

Настоящая проблема сейчас в том, чей ответ я помечаю как правильный? Потому что многие из вас внесли свой вклад в поиск этой проблемы.


person Kezzer    schedule 17.06.2009    source источник


Ответы (5)


Объект 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)
    {

    }
}
person David Basarab    schedule 17.06.2009
comment
Но они бетонные? Они должны быть унаследованы независимо и не должны быть реализованы? - person Kezzer; 17.06.2009

Я предполагаю, что пространство имен и имя типа (контекст данных) верны... сначала дважды проверьте это.

Мне кажется, что кодеген потерпел неудачу, и поэтому у вас есть только ваша половина контекста данных (а не та половина, которую должна предоставить 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). Теперь посмотрим, работает ли это.

person Marc Gravell    schedule 17.06.2009
comment
На самом деле, это почти наверняка так. Никогда не следует размещать операторы использования за пределами пространства имен в файле кода программной части DBML. - person Sander; 17.06.2009
comment
После того, как я сделал это, я попытался перестроить и, помимо ошибки, я заявил, что меня дополнительно приветствовал файл метаданных ошибки 2 «D:\WEB\IntranetMvcAreas\IntranetMvcAreas\bin\IntranetMvcAreas.dll» не удалось найти IntranetMvcAreas.Tests - person Kezzer; 17.06.2009
comment
Это просто то, что ваши модульные тесты не будут счастливыми, пока не будет построена основная dll... так что я не думаю, что это нам что-то говорит. - person Marc Gravell; 17.06.2009
comment
Я также нашел это: that-takes-0-arguments/" rel="nofollow noreferrer">blog.paulgeorge.co.uk/2008/12/07/, но функция уже определена. Все еще не в курсе. Я заново создал dbml с нуля и все равно получаю ту же ошибку. - person Kezzer; 17.06.2009
comment
Возможно, попробуйте воссоздать его без дополнительного файла (переименуйте его и исключите из проекта) - person Marc Gravell; 17.06.2009
comment
Да вообще не повезло. Я пробовал все, что мог придумать, полностью удаляя классы, повторно включая их, включая их с другим именем и т. Д., И ничего не происходит. Думаю, я не смогу получить данные из моей базы данных :) - person Kezzer; 17.06.2009
comment
О, просто подумал, я использую библиотеку областей Фила Хаака, расположенную здесь: haacked.com/archive/2008/11/04/areas-in-aspnetmvc.aspx Возможно, поэтому возникают проблемы? - person Kezzer; 17.06.2009

Ответ Давида Басараба правильный и должен быть помечен как ответ.

Ваш класс не предоставляет никакого конструктора, поэтому предоставляется конструктор по умолчанию. Конструкторы по умолчанию для производных классов могут предоставляться только в том случае, если базовый класс имеет конструктор без параметров. Однако класс DataContext, который является вашим базовым классом в этом примере, не предоставляет конструктор без параметров. Это объясняет сообщение об ошибке, которое компилятор вернул вам.

Изменить:

Пример:

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

class B : A {
}

Попытка компиляции, которая возвращает ошибку в классе B:

«A» не содержит конструктора, который принимает аргументы «0»

person mvr    schedule 22.06.2009
comment
Конструкторы реализованы в файле .designer.cs, я использую разделяемый класс для реализации своей функции. Если я использую частичный класс, он не компилируется, если я его не использую, он компилируется нормально. В обоих случаях конструкторы реализованы. Частичный класс не должен вызывать сбой, потому что при компиляции он должен включать уже определенные конструкторы. - person Kezzer; 22.06.2009
comment
Как называется разделяемый класс, существующий в файле Designer.cs? - person mvr; 22.06.2009
comment
Возможно, вы действительно правы, сэр. Просто проверьте мое редактирование в моем исходном посте, у вас, вероятно, есть идея получше, чем у меня с этим :) - person Kezzer; 22.06.2009
comment
Просто помните, что если у вас есть частичный класс в одном файле FileA.cs, и вы хотите добавить дополнительную информацию к этому классу в частичном классе в другом файле FileB.cs, тогда разделяемый класс, который вы объявляете в FileB.cs, должен иметь то же имя, что и в FileA.cs. Что касается пространства имен, я думаю, вы можете настроить, какое пространство имен использует LINQ to SQL при создании своих классов. В конструкторе должно быть свойство. (Я использую Entity Framework, поэтому я работаю здесь по памяти.) Я все же считаю, что вы должны отметить ответ Дэвида как правильный, потому что он сначала диагностировал источник сообщения об ошибке. - person mvr; 22.06.2009
comment
Согласованный. Что ж, в данный момент я работаю с LINQ, но понятия не имею, на что похожа поддержка нескольких фигур с использованием инфраструктуры сущностей. Ваше здоровье. - person Kezzer; 22.06.2009

Поведение генератора в отношении конструкторов в некоторой степени контролируется свойствами соединения DBML. Если для параметров приложения задано значение True и имеется имя свойства параметров, будет создан конструктор, который считывает строку подключения из параметров приложения сборки. При наличии строки подключения будет создан конструктор с жестко заданной строкой подключения в файле .designer.cs. Если нет ни того, ни другого, он не будет генерировать конструктор без параметра строки подключения, и вы можете безопасно предоставить конструктор без параметров в разделяемом классе, не вызывая конфликта.

Эти изменения параметров не сохраняются при передаче схемы из базы данных туда и обратно, но я просто удаляю параметры подключения из свойств после внесения изменений и перед сохранением DBML.

person cdonner    schedule 23.09.2009

@Sander: Я думаю, ты был на правильном пути. Вместо использования частичного класса и реализации функции для sproc я вместо этого следовал этот блог и использовал для его реализации файл *.designer.cs. Хотя я все еще испытываю проблемы с недопустимым приведением типов, он избавился от исходной проблемы.

person Kezzer    schedule 17.06.2009
comment
Вы редактировали .designer.cs? Это очень плохая идея... ваш код может исчезнуть в любой момент. - person Marc Gravell; 22.06.2009
comment
Как я понял, но я сделал это от отчаяния, а не от чистой воли. Не волнуйтесь, я на собственном горьком опыте убедился, что вам не следует редактировать Designer.cs, иначе все пойдет к чертям. - person Kezzer; 22.06.2009