डब्ल्यूसीएफ डाटा सर्विसेज, डीटीओ, और एंटिटी फ्रेमवर्क: डीबीआईएस नलएक्सप्रेस के लिए तर्क को एक प्राचीन, गणना या संदर्भ प्रकार का संदर्भ देना चाहिए

मुझे एंटिटी फ्रेमवर्क के साथ संयुक्त डब्ल्यूसीएफ डाटा सर्विसेज में $ चुनने के साथ एक अजीब समस्या है। इकाई फ्रेमवर्क इकाइयों को सीधे सेवा द्वारा खुलासा नहीं किया जा रहा है। इसके बजाय, ईएफ पूछताछ की जा रही है, और परिणाम एक डीटीओ पर पेश किए जा रहे हैं जिसका खुलासा किया जा रहा है।

यहां उन प्रश्नों का एक उदाहरण दिया गया है जो डेटाबेस में सही ढंग से गठित प्रश्नों के लिए सभी तरह से काम कर रहे हैं:

/Test.svc/Files

     

/Test.svc/Files?$filter= नाम ईक 'नमूना'

लेकिन यह काम नहीं करेगा:

/Test.svc/Files?$select=Id

यह इस अपवाद को EntityFramework कोड बेस के भीतर फेंकता है:

DbIsNullExpression के लिए तर्क को एक प्राचीन, गणना या संदर्भ प्रकार का संदर्भ देना चाहिए।

... कॉल स्टैक में इस बिंदु पर:

System.Data.Entity.Core.Common.CommandTrees.ExpressionBuilder.DbExpressionBuilder.ValidateIsNull (DbExpression तर्क, बूलियन AllowRowType)

प्रश्न में संस्थाओं के विवरण के लिए नीचे देखें। IQueryable प्रॉपर्टी डेटा स्रोत कंटेनर (IUpdatable को लागू करने) पर है, जिसका उपयोग सेवा द्वारा किया जा रहा है।

  • File is the entity framework object being pulled by dbContext.Files
  • EdmFile is the DTO that I am projecting to, and exposing via the OData service.

मेरे डेटा कंटेनर द्वारा खुलासा IQueryable यहां दिया गया है:

public IQueryable Files
{
    get
    {

        var files = dbContext.Files //EF collection of File
            .Select(f => new EdmFile() { Id = f.Id, Name = f.Name });

        return files; //return projection onto EdmFile
    }
}

If I return files.ToList(), the $select will work. However, the IQueryable will then be prematurely enumerated and ALL of the files (ignoring any requested $filter, etc.) will be retrieved from the database.

यहां इकाई/डीटीओ है जो मैं वास्तव में उजागर कर रहा हूं:

[DataServiceKey("Id")]
public class EdmFile
{
    public long Id { get; set; }
    public string Name { get; set; }
}

इकाई फ्रेमवर्क इकाई यहां दी गई है:

public partial class File
{
    public long Id { get; set; }
    public string Name { get; set; }
}

मैंने बार-बार यह गुगल करने और एसओ को समझने की कोशिश की है, लेकिन परिणाम के साथ कहीं भी नहीं मिल पा रहा हूं। इस पर किसी भी मदद की सराहना की जाएगी !!

4
जोड़ा
विचारों: 1

1 उत्तर

मुझे नहीं पता कि आप किस एंटीटीफ्रेमवर्क का उपयोग कर रहे हैं, लेकिन ऐसा लगता है कि इस समस्या को EntityFramework 6.1.0 में ठीक किया गया था

Here is the issue on codeplex: https://entityframework.codeplex.com/workitem/826

Here is the SO question and answer that helped me: https://stackoverflow.com/a/25320462/466100

0
जोड़ा