जब मैं आलसी लोडिंग सक्षम वर्चुअल विदेशी कुंजी नेविगेशन प्रॉपर्टी पर कस्टम सेट एक्सेसर का उपयोग करता हूं तो इकाई फ्रेमवर्क कोर इसे पसंद नहीं करता है। यह स्टार्टअप/कॉन्फ़िगरेशन के दौरान रनटाइम अपवाद फेंकता है। हालांकि इन गुणों में से एक सेट होने पर मैं हर बार कुछ कस्टम कोड चलाने के लिए चाहता हूं। क्या ईएफ कोर मुझ पर चिल्लाए बिना ऐसा करने का कोई तरीका है? नीचे दिए गए कोड उदाहरण/स्पष्टीकरण:

public class CoilUnit
{
    [Key]
    public Guid Id { get; set; }

    [ForeignKey("project")]
    public virtual CoilProject Project { get; set; }
}
public class CoilProject
{
    [Key]
    public Guid Id { get; set; }
}

उपरोक्त सेटअप ईएफ कोर में ठीक काम करता है, लेकिन यह वह नहीं करता जो मैं करना चाहता हूं।

यह वही चीज है जो मैं चाहता हूं:

public class CoilUnit
{
    [Key]
    public Guid Id { get; set; }

    private CoilProject project;

    [ForeignKey("project")]
    public virtual CoilProject Project
    {
        get { return project; }
        set { project = value; /* Other code here */ }
    }
}
public class CoilProject
{
    [Key]
    public Guid Id { get; set; }
}

चीजों के कोड पक्ष पर, यह वही करता है जो मैं चाहता हूं, लेकिन ईएफ कोर इसे पसंद नहीं करता है और जब मैं ऐसा करता हूं तो चलाने में विफल रहता है।

क्या इस स्थिति में मेरे केक को खाने और खाने का कोई तरीका है? /* Other Code */ को ठीक से चलाने का कोई तरीका है, जबकि EF Core को भी अपना रास्ता बनाने देता है?

धन्यवाद।

1
Nic Estrada 25 अप्रैल 2020, 00:33
एक सेटप्रोजेक्ट (कॉइलप्रोजेक्ट प्रोजेक्ट) विधि जोड़ रहा है जो अतिरिक्त तर्क एक विकल्प करता है? इस तरह आप डिफ़ॉल्ट सेटर रख सकते हैं।
 – 
vvasch
25 अप्रैल 2020, 00:54
बेशक यह तकनीकी रूप से संभव है, लेकिन एक टीम सेटिंग में, रखरखाव के लिए, वास्तव में तब तक नहीं जब तक कि मैं डिफ़ॉल्ट सेटर को अक्षम नहीं करता, जो ईएफ कोर को मार देगा। मुद्दा यह है कि वर्ग के "सार्वजनिक एपीआई" (बोलने के लिए) को इस तरह बनाया जाए कि अतिरिक्त तर्क को ट्रिगर किए बिना CoilUnit.Project को सेट करना असंभव हो।
 – 
Nic Estrada
25 अप्रैल 2020, 01:16
ठीक है, मैं बस यह सुनिश्चित कर रहा था कि आपने स्पष्ट को नजरअंदाज नहीं किया। क्षमा करें, मेरी ओर से कोई अन्य सुझाव नहीं।
 – 
vvasch
25 अप्रैल 2020, 01:44

2 जवाब

सबसे बढ़िया उत्तर

इस मुद्दे का आलसी लोडिंग और कस्टम प्रॉपर्टी सेटर से कोई लेना-देना नहीं है, लेकिन बैकिंग फ़ील्ड और शैडो FK प्रॉपर्टी के नामों के बीच संघर्ष है।

जब नेविगेशन गुण पर लागू किया जाता है, तो ForeignKey विशेषता FK गुण नाम निर्दिष्ट करती है। अगर ऐसी कोई संपत्ति मौजूद नहीं है, तो EF Core छाया प्रॉपर्टी उस नाम के साथ।

ऑटो-प्रॉपर्टी के साथ बैकिंग फ़ील्ड< /a> नाम संकलक द्वारा उत्पन्न होता है, और नहीं "project" है, इसलिए कोई समस्या नहीं है। लेकिन दूसरे मामले में पहले से ही "project" नाम का फ़ील्ड है, इसलिए EF Core तय करता है कि यह विशेषता द्वारा निर्दिष्ट FK संपत्ति है। लेकिन निश्चित रूप से यह नहीं है, और अपेक्षित प्रकार (Guid या Guid?) भी नहीं है, इसलिए अपवाद है।

यदि आप पारंपरिक FK प्रॉपर्टी/कॉलम नामों (जैसे ProjectId) का उपयोग कर रहे थे, तो आपको उस विशेषता की आवश्यकता नहीं होगी और आपको कोई समस्या नहीं होगी। मुझे पूरा यकीन है कि आपको छाया संपत्ति के नाम की परवाह नहीं है, लेकिन तालिका कॉलम नाम।

तो समस्या को हल करने का एक तरीका है ForeignKey विशेषता को हटाना और FK कॉलम नाम को कॉन्फ़िगर करने के लिए धाराप्रवाह API का उपयोग करना:

private CoilProject project;

public virtual CoilProject Project
{
    get { return project; }
    set { project = value; /* Other code here */ }
}

तथा

modelBuilder.Entity<CoilUnit>()
    .Property<Guid?>(nameof(CoilUnit.Project) + "Id")
    .HasColumnName("project");

दूसरा तरीका यह है कि विशेषता को बनाए रखा जाए लेकिन नेविगेशन प्रॉपर्टी बैकिंग फ़ील्ड का नाम बदलकर दूसरे समर्थित पैटर्न, उदाहरण के लिए "_project":

private CoilProject _project;

[ForeignKey("project")]
public virtual CoilProject Project
{
    get { return _project; }
    set { _project = value; /* Other code here */ }
}
3
Ivan Stoev 25 अप्रैल 2020, 16:42
मैंने इसकी जांच नहीं की, लेकिन अगर यह काम करता है, तो मुझे लगता है कि यह समाधान है।
 – 
vvasch
25 अप्रैल 2020, 08:54
1
वाह .... यह निश्चित रूप से था। ईएफ कोर अपवाद संदेश बहुत गूढ़ हैं। इसका कोई मतलब नहीं है कि यह उत्तर है लेकिन यह निश्चित रूप से है।
 – 
Nic Estrada
27 अप्रैल 2020, 19:08

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

public class CoilUnit
{
    [Key]
    public Guid Id { get; set; }

    private CoilProject project;

    [ForeignKey("project")]
    public virtual CoilProject Project { get; set; }

    [NotMapped]
    public virtual CoilProject ProjectNotMapped
    {
        get { return project; }
        set { project = value; /* Other code here */ } 
    }
}

अतिरिक्त गुण जिनमें गेटर्स या सेटर्स नहीं हैं, उन्हें भी मैप नहीं किया जाएगा लिंक:

        public virtual CoilProject ProjectNotMapped
        {
            set { project = value; /* Other code here */ } 
        }
1
romfir 25 अप्रैल 2020, 01:53
1
सही। मैं अपनी सभी मॉडल कक्षाओं में NotMappedAttribute का उपयोग करता हूं। हालांकि यह एक निश्चित समझौता है, और इससे बचने के लिए मैंने यह प्रश्न पूछा है। Project के लिए सेटर सार्वजनिक है, और इसमें अभी भी व्यावसायिक तर्क संलग्न नहीं है, जिसका अर्थ है कि संपत्ति को कहीं से भी यह सुनिश्चित करना संभव है कि इसे सही तरीके से निष्पादित किया जाए।
 – 
Nic Estrada
25 अप्रैल 2020, 02:53
हालांकि, अपनी आखिरी टिप्पणी टाइप करते समय, मैंने एक संभावित समाधान के बारे में सोचा।
 – 
Nic Estrada
25 अप्रैल 2020, 02:54