इकाई ढांचा - अमान्य कॉलम नाम '* _ID'


100

मैंने इसे कोड फ़र्स्ट और डेटाबेस फर्स्ट EF के बीच के कुछ इश्यू तक सीमित कर दिया है, लेकिन मुझे यकीन नहीं है कि इसे कैसे ठीक किया जाए। मैं जितना हो सके उतना स्पष्ट होने की कोशिश करूंगा, लेकिन मैं ईमानदारी से कुछ समझ रहा हूं। यह एंटिटी फ्रेमवर्क 4.4 है

मुझे एक प्रोजेक्ट विरासत में मिला है जिसमें एंटिटी फ्रेमवर्क का उपयोग किया गया था, लेकिन कई वास्तविक फ़ाइलों को वापस जाने के लिए कोई वास्तविक रास्ता नहीं मिला। मैंने EF (डेटाबेस पहले) को फिर से जोड़ा और एक T4 सेटअप को दोहराया जो परियोजना के आसपास बनाया गया था। यह सभी डेटाबेस मॉडल और एक DBContext कोड फ़ाइल के कोड संस्करण उत्पन्न करता है।

यदि मेरा कनेक्शन स्ट्रिंग "सामान्य" .NET कनेक्शन स्ट्रिंग जैसा दिखता है, तो मुझे एक अमान्य कॉलम के बारे में एक त्रुटि मिलती है नाम "ProcessState_ID" मौजूद नहीं है। ProcessState_ID कोड बेस में बिल्कुल भी नहीं है, यह EDMX फाइल या कुछ भी नहीं है। यह क्वेरी में कुछ स्वचालित EF रूपांतरण प्रतीत होता है।

जब मैं कनेक्शन स्ट्रिंग का मिलान इकाई फ्रेमवर्क से करता हूँ तो यह ठीक काम करता है।

अब एंटिटी फ्रेमवर्क के साथ पिछले कोड से मिलान करने की कोशिश में मैं "सामान्य" .NET कनेक्शन स्ट्रिंग रखना चाहूंगा।

इसलिए मेरे यहाँ दो प्रश्न हैं: 1. सामान्य कनेक्शन स्ट्रिंग से EF कनेक्शन स्ट्रिंग में कोड में जाने का एक अच्छा तरीका क्या है? 2. क्या यहां एक और फिक्स है जो मैं अमान्य कॉलम नाम त्रुटि को रोकने के लिए नहीं देख रहा हूं?


3
यह तब भी होता है जब आपके पास केवल एक public virtual Person Person { get; }
एक्सेस एक्सेसर के

जवाबों:


90

यह देखने के लिए जांचें कि क्या आपके पास कोई ICollections है।

जब मुझे पता चला है कि आपके पास एक ICollection है जो एक तालिका का संदर्भ देता है और कोई स्तंभ नहीं है जो यह पता लगा सकता है, तो यह आपके लिए तालिकाओं के बीच संबंध बनाने की कोशिश करने के लिए एक बनाता है। यह विशेष रूप से ICollection के साथ होता है और इसने मुझे "बैट्टी" से निकालने की कोशिश की है।


43
इस उत्तर पर स्पष्ट होने के लिए, क्योंकि यह मेरी स्थिति के लिए सबसे सटीक था (लेकिन जब तक मैंने अपनी समस्या का पता नहीं लगाया तब तक मुझे यह पता नहीं था)। यदि आप तालिका को पुनर्प्राप्त करते समय OtherTable_ID से संबंधित कुछ त्रुटि रखते हैं, तो अपने OtherTable मॉडल पर जाएं और सुनिश्चित करें कि आपके पास वहां ICollection <Table> नहीं है। परिभाषित संबंध के बिना, फ्रेमवर्क यह मान लेगा कि आपके पास अन्य के लिए एक FK होना चाहिए और उत्पन्न SQL में ये अतिरिक्त गुण बनाएं।
LUKE

15
EF ने मेरे 4 घंटे बर्बाद किए
नितिन सावंत

2
@NitinSawant यह है कि? ईएफ मुझे हर दिन 4 घंटे बर्बाद करता है और इसके सभी दोहराव और संयुक्त राष्ट्र के संलग्नक हैं।
याकूब

@LUKE आपकी टिप्पणी ने मुझे बचा लिया। आई लव
यू

1
@ हमें ईएफ नायक की आवश्यकता है, न कि ईएफ हीरो जिसकी हम हकदार हैं। मैं तुमसे प्यार करता हूँ।
मैथ्यू यंग

62

यह उन (मेरे जैसे) के लिए एक देर से प्रवेश है, जिन्होंने तुरंत अन्य 2 उत्तरों को नहीं समझा।

इसलिए...

EF PARENT TABLES KEY-REFERENCE ... और तब से एक्सपोर्ट किए गए नाम को मैप करने की कोशिश कर रहा है ... और जब से डेटाबेस CHILD टेबल रिलेशनशिप में FOREIGN KEY नाम "बदला या छोटा" हुआ ... आपको ऊपर मेसेज मिल जाएगा।

(यह फिक्स EF के संस्करणों के बीच भिन्न हो सकता है)

मेरे लिए FIX WAS:
मॉडल में "ForeignKey" विशेषता को जोड़ना

public partial class Tour
{
    public Guid Id { get; set; }

    public Guid CategoryId { get; set; }

    [Required]
    [StringLength(200)]
    public string Name { get; set; }

    [StringLength(500)]
    public string Description { get; set; }

    [StringLength(50)]
    public string ShortName { get; set; }

    [StringLength(500)]
    public string TourUrl { get; set; }

    [StringLength(500)]
    public string ThumbnailUrl { get; set; }

    public bool IsActive { get; set; }

    [Required]
    [StringLength(720)]
    public string UpdatedBy { get; set; }

    [ForeignKey("CategoryId")]
    public virtual TourCategory TourCategory { get; set; }
}

4
इसने मेरे लिए काम किया। +1 का एकमात्र स्थान होने के कारण मुझे यह उत्तर मिला।
जेरी बेन्सन-मोंटगोमरी

@ जेरी मेरे पास परिभाषित कुंजी है। लेकिन फिर भी यह खोज करता है Category_Id। आपने EF के विभिन्न संस्करणों के लिए फ़िक्सेस के बारे में उल्लेख किया है? मैं EF 6.0 का उपयोग कर रहा हूँ, मैं iadadopt को ठीक क्या कर रहा हूँ?
अजय आराध्या

@ अजय-आराध्या वास्तव में, यह वह व्यक्ति था जिसने मूल रूप से प्रतिक्रिया दी, कैदी-शून्य, जिसने ईएफ के विभिन्न संस्करणों के बारे में टिप्पणी की।
जेरी बेन्सन-मोंटगोमरी

@ जेरीबेन्सन-मोंटगोमरी कभी नहीं! मैंने इसे काम किया। यह 'वन टू वन' मैपिंग थी जिसके कारण इसे खोजा जा रहा था *_ID। वापस संदर्भ सहित ठीक काम किया।
अजय आराध्या

1
आप मेटाडेटा आंशिक वर्ग को जोड़कर भी इसे ठीक कर सकते हैं ताकि जब आप पुनर्जीवित हों तो आपको इसे ठीक नहीं करना पड़ेगा। [MetadataType(typeof(MetaData))] public partial class Tour { public class MetaData { [ForeignKey(nameof(TourCategory))] public virtual TourCategory TourCategory { get; set; } } }
कार्टर मेडलिन

39

पवित्र गाय - कई घंटों की कोशिश के बाद, मैंने आखिरकार यह पता लगा लिया।

मैं पहले EF6 डेटाबेस कर रहा हूं और मैं "हद अज्ञात कॉलम" त्रुटि के बारे में सोच रहा था - यह किसी कारण के लिए तालिका का नाम अंडरस्कोर कॉलम नाम उत्पन्न कर रहा था, और एक बिना किसी स्तंभ को खोजने की कोशिश कर रहा था।

मेरे मामले में, मेरी एक मेज में एक ही प्राथमिक कुंजी में दो विदेशी कुंजी संदर्भ थे - कुछ इस तरह से:

Animals            Owners
=======            ======
AnimalID (PK)      Pet1ID    <- FK to AnimalID
                   Pet2ID    <- also FK to AnimalID

एफई जैसे कुछ अजीब स्तंभ नाम पैदा किया गया था Owners_AnimalID1और Owners_AnimalID2और उसके बाद ही तोड़ दीं।

यहाँ चाल यह है कि इन भ्रामक विदेशी कुंजियों को धाराप्रवाह एपीआई का उपयोग करके ईएफ के साथ पंजीकृत होने की आवश्यकता है!

आपके मुख्य डेटाबेस संदर्भ में, OnModelCreatingविधि को ओवरराइड करें और इकाई कॉन्फ़िगरेशन को बदलें। अधिमानतः, आपके पास एक अलग फ़ाइल होगी जो EntityConfigurationकक्षा का विस्तार करती है , लेकिन आप इसे इनलाइन कर सकते हैं।

किसी भी तरह से आप इसे करते हैं, आपको कुछ इस तरह से जोड़ना होगा:

public class OwnerConfiguration : EntityTypeConfiguration<Owner>
{
    public OwnerConfiguration()
    {
        HasRequired(x => x.Animals)
            .WithMany(x => x.Owners)  // Or, just .WithMany()
            .HasForeignKey(x => x.Pet1ID);
    }
}

और उसी के साथ, ईएफ आपकी उम्मीद के मुताबिक काम करना शुरू कर देगा। बूम।

इसके अलावा, यदि आप ऊपर दिए गए अशक्त स्तंभ का उपयोग करते हैं, तो आपको वही त्रुटि मिलेगी - .HasOptional()इसके बजाय केवल उपयोग करें .HasRequired()


यहाँ लिंक है कि मुझे कूबड़ पर डाल दिया है:

https://social.msdn.microsoft.com/Forums/en-US/862abdae-b63f-45f5-8a6c-0bdd6eeabfdb/getting-sqlexception-invalid-column-name-userid-from-ef4-codeonly?forum=adonetefx

और फिर, धाराप्रवाह एपीआई डॉक्स मदद करते हैं, विशेष रूप से विदेशी प्रमुख उदाहरण:

http://msdn.microsoft.com/en-us/data/jj591620.aspx

आप कुंजी को दूसरे छोर पर रख सकते हैं, जैसा कि यहाँ वर्णित है:

http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx

कुछ नई समस्याएं हैं जो अब मैं चला रहा हूं, लेकिन यह बहुत बड़ा वैचारिक अंतर था जो गायब था। आशा करता हूँ की ये काम करेगा!


1
बहुत बहुत धन्यवाद .. मेरे पास एक ही मुद्दा था।
सचिन पाराशर

14

मान्यताओं:

  • Table
  • OtherTable
  • OtherTable_ID

अब इनमें से कोई एक तरीका चुनें:


ए)

हटाना ICollection<Table>

यदि आपके पास OtherTable_IDपुनर्प्राप्त करने के दौरान कुछ त्रुटि है Table, तो अपने OtherTableमॉडल पर जाएं और सुनिश्चित करें कि आपके पास ICollection<Table>वहां नहीं है । परिभाषित संबंध के बिना, फ्रेमवर्क यह मान लेगा कि आपके पास अन्य के लिए एक FK होना चाहिए और उत्पन्न SQL में ये अतिरिक्त गुण बनाएं।

इस उत्तर का सारा श्रेय @LUKE को है। उपरोक्त उत्तर @drewid उत्तर के तहत उनकी टिप्पणी है। मुझे लगता है कि उनकी टिप्पणी इतनी साफ है तो मैंने इसे एक जवाब के रूप में लिखा।


बी)

  • जोड़े OtherTableIdकोTable

तथा

  • डेटाबेस OtherTableIdमें परिभाषित करेंTable

1
इस तरह के एक क्रूर जवाब!
अमीर होसैन अहमदी

यह उत्तर वास्तव में जल्दी से दिन के द्वारा बचाया गया है। और LUKE के लिए धन्यवाद, मैंने उनकी टिप्पणी पढ़ी। हालाँकि @drewid ने उत्तर श्रृंखला के आखिरी में इसे बनाया था, लेकिन यह शानदार था और इस स्थिति का सामना करने के लिए सबसे अधिक जरूरत क्या थी।
तिवारी

3

मेरे मामले में मैं इस तरह से दो विदेशी कुंजी से बना एक प्राथमिक कुंजी को गलत तरीके से परिभाषित कर रहा था:

HasKey(x => x.FooId);
HasKey(x => x.BarId);

HasRequired(x => x.Foo)
    .WithMany(y => y.Foos);
HasRequired(x => x.Bar);

मुझे जो त्रुटि मिल रही थी, वह "अमान्य कॉलम नाम Bar_ID" थी।

कंपोजिट प्राथमिक कुंजी को सही ढंग से निर्दिष्ट करने से समस्या का समाधान होता है:

HasKey(x => new { x.FooId, x.BarId });

...

3

मेरे लिए इस व्यवहार का कारण धाराप्रवाह एपीआई के साथ परिभाषित मानचित्रण के साथ मुद्दा था। मेरे पास 2 संबंधित प्रकार थे, जहां टाइप ए में वैकल्पिक प्रकार बी ऑब्जेक्ट था, और टाइप बी में कई ए ऑब्जेक्ट थे।

public class A 
{
    
    public int? BId {get; set;}
    public B NavigationToBProperty {get; set;}
}
public class B
{
    
    public List<A> ListOfAProperty {get; set;}
}

मैं इस तरह धाराप्रवाह एपीआई के साथ मानचित्रण परिभाषित किया था:

A.HasOptional(p=> p.NavigationToBProperty).WithMany().HasForeignKey(key => key.BId);

लेकिन समस्या यह थी कि टाइप बी में नेविगेशन संपत्ति थी List<A>, इसलिए परिणामस्वरूप मेरे पास थाSQLException Invalid column name A_Id

मैंने Visual Studio डीबग को EF DatabaseContext.Database.og से जोड़ा है। आउटपुट से SQL को VS आउटपुट-> डिबग विंडो में बनाया गया है।

db.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);

और उत्पन्न SQL में बी तालिका से 2 संबंध थे -> एक सही आईडी और अन्य के साथ A_Id

समस्या का मुद्दा यह था, कि मैंने इस B.List<A>नेविगेशन प्रॉपर्टी को मैपिंग में नहीं जोड़ा ।

तो इस तरह से मेरे मामले में सही मैपिंग होनी थी:

A.HasOptional(p=> p.NavigationToBProperty).WithMany(x => x.ListOfAProperty).HasForeignKey(key => key.BId);

2

मेरे मामले में इस समस्या का कारण एक लापता डेटाबेस पर एक लापता कुंजी कुंजी बाधा था। इसलिए मौजूदा वर्चुअल ICollection को सफलतापूर्वक लोड नहीं किया गया था।


1

मुझे भी यह समस्या थी और ऐसा लगता है कि कुछ अलग कारण हैं। मेरे लिए यह एक अभिभावक वर्ग में लंबे समय के बजाय एक आईडी प्रॉपर्टी को गलत तरीके से परिभाषित किया गया था जिसमें नेविगेशन ऑब्जेक्ट शामिल था। डेटाबेस में आईडी फ़ील्ड को बिगिंट के रूप में परिभाषित किया गया था जो सी # में लंबे समय से मेल खाती है। यह एक संकलन समय त्रुटि का कारण नहीं बना, लेकिन ओपी को मिली समान रन त्रुटि का कारण बना:

// Domain model parent object
public class WidgetConfig 
{
    public WidgetConfig(long id, int stateId, long? widgetId)
    {
        Id = id;
        StateId = stateId;
        WidgetId = widgetId;
    }

    private WidgetConfig()
    {
    }

    public long Id { get; set; }

    public int StateId { get; set; }

    // Ensure this type is correct
    public long? WidgetId { get; set; } 

    public virtual Widget Widget { get; set; }
}

// Domain model object
public class Widget
{
    public Widget(long id, string name, string description)
    {
        Id = id;
        Name = name;
        Description = description;
    }

    private Widget()
    {
    }

    public long Id { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }
}

// EF mapping
public class WidgetConfigMap : EntityTypeConfiguration<WidgetConfig>
{
    public WidgetConfigMap()
    {
        HasKey(x => x.Id);
        ToTable(nameof(WidgetConfig));
        Property(x => x.Id).HasColumnName(nameof(WidgetConfig.Id)).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
        Property(x => x.StateId).HasColumnName(nameof(WidgetConfig.StateId));
        Property(x => x.WidgetId).HasColumnName(nameof(WidgetConfig.WidgetId));
    }
}   

// Service
public class WidgetsService : ServiceBase, IWidgetsService
{
    private IWidgetsRepository _repository;

    public WidgetsService(IWidgetsRepository repository)
    {
        _repository = repository;
    }

    public List<WidgetConfig> ListWithDetails()
    {
        var list = _repository.ListWithDetails();

        return new WidgetConfigMapping().ConvertModelListToDtoList(list).ToList();
    }
}   

// Repository
public class WidgetsRepository: BaseRepository<WidgetConfig, long>, IWidgetsRepository
{
    public WidgetsRepository(Context context)
        : base(context, id => widget => widget.Id == id)
    {
    }

    public IEnumerable<WidgetConfig> ListWithDetails()
    {
        var widgets = Query
            .Include(x => x.State)
            .Include(x => x.Widget);

        return widgets;
    }
}

1

मेरे लिए समस्या यह है कि मैंने अपने ऐप में दो बार मैप किया था - एक बार कोड फ़र्स्ट के ज़रिए, एक बार डेटाबेस फ़र्स्ट के ज़रिए।

या तो हटाने से मेरे मामले में समस्या हल हो जाती है।


1

मेरे लिए, यह ईएफ के बहुवचन मुद्दों के कारण हुआ। "-Status" जैसी किसी चीज़ के साथ समाप्त होने वाली तालिकाओं के लिए, EF सोचता है कि यह एकवचन है "-Statu"। इकाई और DB तालिका नाम को "-StatusTypes" में बदलना इसे ठीक कर दिया।

इस तरह, आपको हर बार अपडेट होने पर इकाई मॉडल का नाम बदलने की आवश्यकता नहीं होगी।


0

यदि आपके पास एक से अधिक बार एक ही टेबल पर विदेशी प्रमुख संदर्भ हैं, तो आप InverseProperty का उपयोग कर सकते हैं

कुछ इस तरह-

[InverseProperty("MyID1")]
public virtual ICollection<MyTable> set1 { get; set; }
[InverseProperty("MyID2")]
public virtual ICollection<MyTable> set2 { get; set; }

0

मेरे लिए (विजुअल स्टूडियो 2017 और एंटिटी फ्रेमवर्क 6.1.3 के तहत डेटाबेस-पहला मॉडल का उपयोग करके), विजुअल स्टूडियो को फिर से शुरू करने और पुनर्निर्माण के बाद समस्या दूर हो गई।


इस सवाल का कोई निश्चित जवाब नहीं दिखता क्योंकि आप इसका कारण नहीं बताते हैं। इसे एक टिप्पणी के रूप में रखा जाना चाहिए।
इबो

0

मेरे मामले में मेरा बीज विधि डेटा अभी भी एक टेबल कॉलम कह रहा था जिसे पिछले माइग्रेशन में छोड़ दिया गया था। यदि आप ऑटोमैपर का उपयोग कर रहे हैं तो अपने मैपिंग को दोबारा जांचें।


0

मेरे मामले में, मेरे पास पहले से ही एक डेटाबेस (डेटाबेस झगड़े) है। यहाँ सभी टिप्पणियों के लिए धन्यवाद, मुझे अपना समाधान मिल गया:

तालिकाओं का संबंध होना चाहिए, लेकिन स्तंभों के नाम को अलग-अलग करने और फॉरेनके विशेषता जोड़ने की आवश्यकता है।

[ForeignKey ("PrestadorId")] सार्वजनिक आभासी AwmPrestadoresServicios Colaboradores {प्राप्त करें; सेट; }

यही है, PRE_ID PK है, लेकिन दूसरी तालिका में FK PRESTADOR_ID है, तो यह काम करता है। यहाँ सभी टिप्पणियों के लिए धन्यवाद मुझे अपना समाधान मिल गया। ईएफ रहस्यमय तरीके से काम करता है।


0

यदि आपके पास एक ही तालिका पर एक नेविगेशन संपत्ति के साथ यह समस्या है, तो आपको हमारी संपत्ति का नाम बदलना होगा।

उदाहरण के लिए :

Table : PERSON
Id
AncestorId (with a foreign key which references Id named Parent) 

आप बदलना होगा AncestorIdके लिए PersonId

ऐसा लगता है कि EF एक कुंजी बनाने की कोशिश कर रहा है ParentIdक्योंकि यह Ancestor नाम की एक तालिका नहीं ढूंढ सका है ...

संपादित करें: यह पहले डेटाबेस के लिए एक तय है!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.