Расширение System.Data.Linq.DataContext - PullRequest
12 голосов
/ 17 июня 2009

У меня есть класс, отражающий мой 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, на которое указывает проблема

(кстати, это не имеет отношения к очень недавнему посту, который я сделал, просто я работаю над тем же)

EDIT

Вероятно, стоит уточнить это, поэтому, пожалуйста, прочитайте очень внимательно.

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

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

Ответы [ 5 ]

6 голосов
/ 17 июня 2009

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

    }
}
5 голосов
/ 17 июня 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

Теперь зайдите в дизайнер, подправьте что-нибудь (например, измените имя свойства и верните его обратно) и нажмите «Сохранить» (это заставит кодоген). Теперь посмотрим, работает ли он.

2 голосов
/ 22 июня 2009

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

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

Редактировать

Пример:

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

class B : A {
}

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

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

1 голос
/ 23 сентября 2009

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

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

0 голосов
/ 17 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...