12

मैं SQL सर्वर xml इकाई इकाई के लिए कॉलम प्रकार के रूप में टाइप करना चाहता हूं।ईएफ 4.1 कोड में एक्सएमएल डेटा टाइप पहले

this thread के अनुसार इसे करने के लिए स्ट्रिंग प्रकार इस तरह के एक स्तंभ मैप करने के लिए संभव है:

public class XmlEntity 
{ 
    public int Id { get; set; } 

    [Column(TypeName="xml")] 
    public string XmlValue { get; set; } 
} 

तालिका सही ढंग से इस परिभाषा से datebase में उत्पन्न होता है। नया XmlEntity ऑब्जेक्ट भी बनाया जा सकता है।

लेकिन तब मैं डेटाबेस से कुछ इकाई प्राप्त करने की कोशिश:

var entity = db.XmlEntities.Where(e => e.Id == 1).FirstOrDefault(); 

कोई त्रुटि होती है: मॉडल पीढ़ी के दौरान

एक या अधिक सत्यापन त्रुटियों का पता चला रहे थे System.Data .dm.EdmEntityType: EntityType 'XElement' की कोई कुंजी परिभाषित नहीं है। इस EntityType के लिए कुंजी परिभाषित करें।

उत्तर

18

समस्या मेरी आवरण संपत्ति के साथ था:

[NotMapped] 
public XElement XmlValueWrapper 
{ 
    get { return XElement.Parse(XmlValue); } 
    set { XmlValue = value.ToString(); } 
} 

मैं निर्दिष्ट नहीं किया विशेषता NotMapped।

+1

साझा करने के लिए धन्यवाद! –

+0

@alexey, महान प्रश्न और उत्तर, लेकिन अगर आप इसमें XElement संपत्ति शामिल करते हैं तो सवाल अधिक समझ में नहीं आता है - एमएसडीएन लेखों के अनुसार? वर्तमान में कोई XElement संपत्ति नहीं है। तो यह अस्पष्ट है कि एकमात्र परिवर्तन [NotMapped] विशेषता है। –

7

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

[Column(TypeName = "xml")] 
public String XmlContent { get; set; } 

[NotMapped] 
public XElement InitializedXmlContent 
{ 
    get { return XElement.Parse(XmlContent); } 
    set { XmlContent = value.ToString(); } 
} 
3

इस तरह आप उस डेटा टिप्पणियों में, आप Fluent एपीआई का उपयोग करने के लिए (और का उपयोग एक मानचित्रण वर्ग) चाहते हैं तो करते हैं तो:

public partial class XmlEntityMap : EntityTypeConfiguration<XmlEntity> 
{ 
    public FilterMap() 
    { 
     // ... 
     this.Property(c => c.XmlContent).HasColumnType("xml"); 

     this.Ignore(c => c.XmlValueWrapper); 
    } 
} 

आप तो DbContext पर OnModelCreating अधिभावी द्वारा सुविज्ञ एपीआई का उपयोग करते हैं मॉडलबिल्डर के साथ बस "यह" बदलें। एंटीटी < एक्सएमएलएन्टिटी >()

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