2009-06-17 16 views
12

Mam klasy odzwierciedlających mój plik dbml, która rozszerza DataContext, ale z jakiegoś dziwnego powodu, że każe miRozszerzanie System.Data.Linq.DataContext

System.Data.Linq.DataContext”nie zawiera konstruktor że trwa argumentów „0””

i już po różne tutoriale na ten temat i nie napotkał ten problem, i VS nie wydaje się w stanie go naprawić.

Oto moja realizacja

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; 
    } 
    } 
} 

I to ContractsControlDataContext który wskazał na jak problem

(btw, to nie ma żadnego związku z niedawnym poście zrobiłem, to tylko ja pracuję na tej samej rzeczy)

EDYCJA

Warto to wyjaśnić, dlatego proszę bardzo uważnie przeczytać.

Jeśli użytkownik nie będzie rozszerzał DataContext w klasie częściowej, wówczas nie będzie dostępny.

„Intranet.ContractsControlDataContext” nie zawierają definicji „ExecuteMethodCall” i żadna metoda rozszerzenie „ExecuteMethodCall” przyjęcie pierwszego argumentu typu „Intranet.ContractsControlDataContext” można odnaleźć (czy brakuje using dyrektywa lub odniesienie do montażu?)

Może brakuje mi czegoś niewiarygodnie głupiego?

SOLVED

myślę może Visual Studio walczyli tutaj, ale ja całkowicie polegała na auto wygenerowany kod. Po kliknięciu prawym przyciskiem myszy na widoku projektowania języka modelowania bazy danych i naciśnięciu klawisza "Wyświetl kod" automagicznie tworzy on dla ciebie klasę częściową w ramach określonego obszaru nazw, , jednak, ta przestrzeń nazw była błędna. Gdyby ktoś mógł to dla mnie wyjaśnić, byłbym bardzo wdzięczny.

Plik .designer.cs siedzi w namespace Intranet.Areas.Accounts.Models jednak plik .cs (częściowe klasa generowane dla z .designer.cs złożyć przez Visual Studio) był w namespace Intranet. Łatwo dostrzec kogoś bardziej doświadczonego w tej dziedzinie niż ja.

Prawdziwym problemem jest teraz, kto odpowie, czy zaznaczam jako poprawny? Ponieważ wielu z was przyczyniło się do znalezienia tego problemu.

Odpowiedz

6

Obiekt DataContext dla linq nie ma pustego konstruktora. Ponieważ nie ma pustego konstruktora, musisz przekazać jeden z przedmiotów poza bazą.

Z MetaData dla 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); 

Coś tak prostego, jak to działa.Każda klasa dziedzicząca z DataConext musi przekazać do konstruktora podstawowego co najmniej jeden z typów, z których jest wyjątkiem.

public class SomeClass : System.Data.Linq.DataContext 
{ 
    public SomeClass(string connectionString) 
     :base(connectionString) 
    { 

    } 
} 
+0

Ale są konkretne? Powinny być dziedziczone niezależnie i nie muszą być wdrażane? – Kezzer

5

mam zakładając że przestrzeń nazw i (dane-context) wpisać nazwy są prawidłowe ... dwukrotnie najpierw sprawdzić to.

Wydaje mi się, że kodegen się nie powiódł, a więc masz tylko połowę kontekstu danych (nie połowę tego, co IDE ma dostarczyć). Istnieje znany błąd w LINQ-SQL, w którym to może się nie powieść, jeśli (jak w twoim przypadku) deklaracje using znajdują się powyżej obszaru nazw. Nie, nie żartuję. Spróbuj zmienić kod:

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 

Teraz przejdź do projektanta, podkręcić coś (na przykład zmienić nazwę właściwości i zmienić go z powrotem) i naciśnij zapisz (ta wymusza Codegen). Teraz sprawdź, czy to działa.

+0

Rzeczywiście, jest prawie pewne, że tak jest. Nigdy nie powinno się używać instrukcji poza obszarem nazw w pliku z kodem DBML. – Sander

+0

Po tym, że próbowałem odbudować i na górze błędu oświadczyłem, że zostałem dodatkowo powitany przez "Błąd Plik metadanych" D: \ WEB \ IntranetMvcAreas \ IntranetMvcAreas \ bin \ IntranetMvcAreas.dll "nie mógł zostać znaleziony \t IntranetMvcAreas.Tests " – Kezzer

+0

To jest po prostu, że twoje testy jednostkowe nie będą szczęśliwe, dopóki nie zbuduje głównej biblioteki dll ... więc nie sądzę, że mówi nam cokolwiek. –

0

@Sander: Myślę, że jesteś na dobrej drodze. Zamiast używać częściowej klasy i implementowania funkcji dla sproca, zamiast tego podążałem za this blog i użyłem pliku * .designer.cs do jej implementacji. Podczas gdy wciąż mam problemy z nieprawidłowym rzutowaniem, pozbyłem się pierwotnego problemu.

+0

Edytowałeś plik .designer.cs? To bardzo zły pomysł ... Twój kod może zniknąć w każdej chwili. –

+0

Jak się dowiedziałem, ale zrobiłem to z desperacji, w przeciwieństwie do czystej woli. Nie martw się, odkryłem na własnej skórze, że nie powinieneś edytować designer.cs inaczej wszystko się rozpadnie. – Kezzer

2

Odpowiedź Davida Basaraba jest poprawna i powinna być oznaczona jako odpowiedź.

Twoja klasa nie dostarcza żadnego konstruktora, więc dostarczany jest domyślny konstruktor. Domyślne konstruktory dla klas pochodnych mogą być dostarczane tylko wtedy, gdy klasa podstawowa ma konstruktor bez parametrów. Jednak klasa DataContext, która jest twoją klasą bazową w tym przykładzie, nie dostarcza konstruktora bez parametrów. To wyjaśnia komunikat o błędzie, który kompilator zwrócił ci.

Edit:

Przykład:

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

class B : A { 
} 

Próba kompilacji, która zwraca błąd w klasie B:

'A' nie zawiera konstruktor, że trwa " Argumenty 0 '

+0

Konstruktory są zaimplementowane w pliku .designer.cs, używam klasy częściowej do implementacji mojej funkcji. Jeśli użyję klasy częściowej, to nie uda się jej skompilować, jeśli jej nie użyję, kompiluje się dobrze. W obu przypadkach implementowane są konstruktory. Klasa częściowa nie powinna powodować niepowodzenia, ponieważ podczas kompilacji powinna przynieść już zdefiniowane konstruktory. – Kezzer

+0

Jaka jest nazwa klasy częściowej, która istnieje w pliku designer.cs? – mvr

+0

Możesz rzeczywiście być poprawny proszę pana. Po prostu sprawdź moją edycję w moim oryginalnym wpisie, prawdopodobnie masz lepszy pomysł niż ja z tym :) – Kezzer

1

Zachowanie generatora względem konstruktorów jest do pewnego stopnia kontrolowane przez właściwości połączenia DBML. Jeśli Ustawienia aplikacji mają wartość True i istnieje nazwa właściwości ustawienia, wygeneruje ona konstruktora odczytującego ciąg połączenia z Ustawień aplikacji zespołu. Jeśli istnieje ciąg połączenia, wygeneruje on konstruktora z zakodowanym ciągiem połączenia w pliku .designer.cs. Jeśli nie istnieje, nie wygeneruje konstruktora bez parametru ciągu połączenia i można bezpiecznie dostarczyć konstruktora bez parametrów w częściowej klasie bez powodowania konfliktu.

Te zmiany ustawień nie przetrwają cyklu podróży schematu z bazy danych, ale po wprowadzeniu zmian i po zapisaniu DBML po prostu wyczyściam ustawienia połączenia z właściwości.