Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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 для его реализации, Хотя я все еще испытываю проблемы с недопустимым типом, он избавился от исходной проблемы.