2009-06-17 14 views
12

मैं एक वर्ग मेरी dbml फ़ाइल जो DataContext फैली को दर्शाती है, लेकिन कुछ अजीब कारण के लिए यह मेरेविस्तार System.Data.Linq.DataContext

System.Data.Linq.DataContext बता रही है 'एक निर्माता शामिल नहीं है कि '0' तर्क '

मैं इस पर विभिन्न ट्यूटोरियल का पालन किया है और इस समस्या का सामना नहीं किया है लेता है, और वी.एस. इसे ठीक करने में सक्षम प्रतीत नहीं होता है।

यहाँ मेरी कार्यान्वयन

है
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 कि समस्या के रूप में की दिशा में रखे है

(Btw, यह एक बहुत ही हाल के पोस्ट मैंने बनाया से कोई संबंध नहीं है, यह सिर्फ मैं एक ही बात पर काम कर रहा हूँ है)

संपादित करें

शायद यह स्पष्ट करने लायक है, इसलिए कृपया बहुत सावधानी से पढ़ें।

यदि आप आंशिक वर्ग में डेटाकॉन्टेक्स्ट का विस्तार नहीं करते हैं, तो ExecuteMethodCall पहुंच योग्य नहीं है।

'Intranet.ContractsControlDataContext' प्रकार 'Intranet.ContractsControlDataContext' का एक पहला तर्क को स्वीकार करने 'ExecuteMethodCall' और कोई विस्तार विधि के लिए एक परिभाषा शामिल नहीं है 'ExecuteMethodCall' पाया जा सकता है (यदि आप एक का उपयोग कर के निर्देश या एक याद कर रहे हैं असेंबली संदर्भ?)

शायद मुझे कुछ अविश्वसनीय बेवकूफ याद आ रही है?

हल

मुझे लगता है कि शायद दृश्य स्टूडियो यहाँ संघर्ष किया, लेकिन मैं स्वत: जनरेट कोड पर पूरी तरह से भरोसा किया है। डेटाबेस मॉडलिंग भाषा डिज़ाइन व्यू पर राइट क्लिक करते समय और "व्यू कोड" पर क्लिक करते समय यह स्वचालित नामस्थान के भीतर आपके लिए आंशिक रूप से आंशिक कक्षा बनाता है, हालांकि, यह नामस्थान गलत था। अगर कोई मेरे लिए यह स्पष्ट कर सकता है तो मैं सबसे ज्यादा सराहना करता हूं।

.designer.cs फ़ाइल namespace Intranet.Areas.Accounts.Models में बैठता है, तथापि .cs फ़ाइल (आंशिक वर्ग के लिए उत्पन्न .designer.cs विजुअल स्टूडियो द्वारा दायर ) namespace Intranet में था। मेरे से इस क्षेत्र में किसी और के लिए अनुभवी किसी के लिए स्पॉट करना आसान है।

असली समस्या अब है, मैं किस उत्तर का सही मानता हूं? क्योंकि आप में से कई ने इस मुद्दे को खोजने में योगदान दिया है।

उत्तर

6

लिनक के लिए ऑब्जेक्ट डेटाकॉन्टेक्स्ट में खाली कन्स्ट्रक्टर नहीं है। चूंकि इसमें खाली कन्स्ट्रक्टर नहीं है, इसलिए आपको आधार को छोड़कर उन वस्तुओं में से एक को पास करना होगा।

डेटाकॉन्टेक्स्ट के लिए मेटाडेटा से।

// 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); 

कुछ आसान काम करेगा।डेटाकोनक्स्ट से प्राप्त होने वाली किसी भी कक्षा को बेस कंस्ट्रक्टर को कम से कम एक प्रकार को छोड़कर इसे छोड़ना होगा।

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

    } 
} 
+0

लेकिन वे ठोस हैं? उन्हें विरासत में माना जाना चाहिए और लागू नहीं किया जाना चाहिए? – Kezzer

5

मैं कि नाम स्थान और (डेटा-संदर्भ) टाइप नाम संभालने कर रहा हूँ सही ... पुनः जाँच लें कि पहले कर रहे हैं।

मुझे लगता है कि कोडजन विफल रहा है, और इसलिए आपके पास आपके डेटा-संदर्भ का आधा हिस्सा है (आईडीई का आधा हिस्सा प्रदान करने के लिए नहीं है)। 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 

अब डिजाइनर में जाते हैं, कुछ tweak (उदाहरण के लिए, एक संपत्ति का नाम बदलने और इसे वापस फिर से बदल) और बचाने मारा (यह codegen बलों)। अब देखें कि यह काम करता है या नहीं।

+0

दरअसल, यह लगभग निश्चित होना निश्चित है। किसी को डीबीएमएल की कोड-बैक फ़ाइल में नामस्थान के बाहर उपयोग करने वाले बयान कभी नहीं रखना चाहिए। – Sander

+0

मैंने ऐसा करने के बाद मैंने पुनर्निर्माण की कोशिश की और त्रुटि के शीर्ष पर मैंने कहा कि मुझे अतिरिक्त त्रुटि मिली है "त्रुटि मेटाडेटा फ़ाइल 'डी: \ WEB \ IntranetMvcAreas \ IntranetMvcAreas \ bin \ IntranetMvcAreas.dll' नहीं मिला \t IntranetMvcAreas.Tests " – Kezzer

+0

यह बस इतना है कि कोर यूनिट बनाने तक आपका यूनिट परीक्षण खुश नहीं होगा ... इसलिए मुझे नहीं लगता कि हमें कुछ भी बताता है –

0

@ सैंडर: मुझे लगता है कि आप सही रास्ते पर थे। आंशिक वर्ग का उपयोग करने और स्पोक के लिए फ़ंक्शन को कार्यान्वित करने के बजाय मैंने this blog का पालन किया और इसे लागू करने के लिए * .designer.cs फ़ाइल का उपयोग किया। जबकि मुझे अभी भी अमान्य प्रकार के कास्टिंग के साथ समस्याएं आ रही हैं, तो यह मूल समस्या से छुटकारा पा लिया।

+0

आपने .designer.cs संपादित किया है? यह एक बहुत बुरा विचार है ... आपका कोड किसी भी समय गायब हो सकता है। –

+0

जैसा कि मैंने पाया, लेकिन मैंने शुद्ध इच्छा के विरोध में निराशा से बाहर किया। चिंता न करें, मुझे मुश्किल तरीका पता चला है कि आपको designer.cs को संपादित नहीं करना चाहिए अन्यथा सभी नरक टूट जाते हैं। – Kezzer

2

डेविड बसराब का जवाब सही है और इसे उत्तर के रूप में चिह्नित किया जाना चाहिए।

आपकी कक्षा कोई भी निर्माता प्रदान नहीं कर रही है, इसलिए एक डिफ़ॉल्ट कन्स्ट्रक्टर प्रदान किया जाता है। व्युत्पन्न कक्षाओं के लिए डिफ़ॉल्ट कन्स्ट्रक्टर केवल तभी प्रदान किए जा सकते हैं जब बेस क्लास में पैरामीटर रहित कन्स्ट्रक्टर हो। हालांकि, इस उदाहरण में डेटाकॉन्टेक्स्ट क्लास आपकी बेस क्लास है जो पैरामीटर रहित कन्स्ट्रक्टर प्रदान नहीं करती है। यह आपके द्वारा लौटाए गए त्रुटि संदेश को समझाता है।

संपादित:

उदाहरण:

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

class B : A { 
} 

कि वर्ग बी में एक त्रुटि देता है संकलन करने का प्रयास:

'ए' एक निर्माता है कि 'लेता है शामिल नहीं है 0 'तर्क

+0

रचनाकारों को .designer.cs फ़ाइल में कार्यान्वित किया गया है, मैं अपने फ़ंक्शन को लागू करने के लिए आंशिक वर्ग का उपयोग कर रहा हूं। यदि मैं आंशिक वर्ग का उपयोग करता हूं तो यह संकलित करने में विफल रहता है, अगर मैं इसका उपयोग नहीं करता, तो यह ठीक से संकलित करता है। दोनों मामलों में रचनाकारों को लागू किया जाता है। आंशिक वर्ग को असफल होने का कारण नहीं बनना चाहिए क्योंकि संकलन पर इसे पहले से परिभाषित कन्स्ट्रक्टर में लाया जाना चाहिए। – Kezzer

+0

design.cs फ़ाइल में मौजूद आंशिक वर्ग का नाम क्या है? – mvr

+0

आप वास्तव में सही सर हो सकते हैं। बस मेरी मूल पोस्ट में मेरे संपादन की जांच करें, आपको शायद इस से बेहतर विचार मिल गया है :) – Kezzer

1

कन्स्ट्रक्टर के संबंध में जेनरेटर का व्यवहार कुछ हद तक डीबीएमएल के कनेक्शन गुणों द्वारा नियंत्रित किया जाता है। यदि एप्लिकेशन सेटिंग्स सही है, और वहां एक सेटिंग प्रॉपर्टी नाम है, तो यह एक कन्स्ट्रक्टर उत्पन्न करेगा जो असेंबली की एप्लिकेशन सेटिंग्स से कनेक्शन स्ट्रिंग को पढ़ता है। यदि कोई कनेक्शन स्ट्रिंग है, तो यह .designer.cs फ़ाइल में हार्डकोडेड कनेक्शन स्ट्रिंग के साथ एक कन्स्ट्रक्टर उत्पन्न करेगा। यदि न तो है, तो यह कनेक्शन स्ट्रिंग पैरामीटर के बिना एक कन्स्ट्रक्टर उत्पन्न नहीं करेगा, और आप बिना किसी संघर्ष के आंशिक वर्ग में पैरामीटर-कम कन्स्ट्रक्टर प्रदान कर सकते हैं।

ये सेटिंग्स परिवर्तन डेटाबेस से स्कीमा की एक गोल यात्रा में नहीं टिकते हैं, लेकिन मैं परिवर्तन करने के बाद और डीबीएमएल को सहेजने से पहले गुणों से कनेक्शन सेटिंग्स को साफ़ करता हूं।

संबंधित मुद्दे