0

我有以下实体框架对象:如何将XML文档映射到实体框架对象?

namespace Proj.Accounting.Entity 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Xml.Serialization; 

    public partial class DocumentStatus 
    { 
     public DocumentStatus() 
     { 
      this.Documents = new HashSet<Document>(); 
      this.DocumentsTrackings = new HashSet<DocumentsTracking>(); 
      this.DocumentsTrackingChildDocuments = new HashSet<DocumentsTrackingChildDocument>(); 
     } 
     [XmlElement("StateId")] 
     public int StateId { get; set; } 
     [XmlElement("StateName")] 
     public string StateName { get; set; } 
     [XmlElement("GroupId")] 
     public Nullable<int> GroupId { get; set; } 

     public virtual ICollection<Document> Documents { get; set; } 
     public virtual ICollection<DocumentsTracking> DocumentsTrackings { get; set; } 
     public virtual ICollection<DocumentsTrackingChildDocument> DocumentsTrackingChildDocuments { get; set; } 
    } 
} 

我有下面的类映射与XML字段的实体(不喜欢的工作):

using System; 
using System.Collections; 
using System.IO; 
using System.Xml.Serialization; 

namespace Proj.Accounting.Data 
{ 
    class XMLObjects 
    { 
     public static T ConvertXmlToClass<T>(string xml) 
     { 
      var serializer = new XmlSerializer(typeof(T)); 
      return (T)serializer.Deserialize(new StringReader(xml)); 
     } 
    } 
} 

,我使用的方法映射数据:

private void button1_Click(object sender, EventArgs e) 
{ 
    string xml = ""; 
    xml += "<?xml version=\"1.0\" encoding=\"UTF - 8\"?>"; 
    xml += "<root>"; 
    xml += " <success>true</success>"; 
    xml += " <data>"; 
    xml += " <item>"; 
    xml += " <StateId>0</StateId>"; 
    xml += " <StateName>Шаблон</StateName>"; 
    xml += " <GroupId>0</GroupId>"; 
    xml += " </item>"; 
    xml += "</root>"; 
    DocumentStatus documentStatus = new DocumentStatus(); 
    documentStatus = XMLObjects.ConvertXmlToClass<DocumentStatus>(xml); 
    int a = 0; 
} 

我得到以下异常

 
System.InvalidOperationException was unhandled HResult=-2146233079 
Message=There was an error reflecting type 'Proj.Accounting.Entity.DocumentStatus'. Source=System.Xml 
StackTrace: 
     at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter) 
     at System.Xml.Serialization.XmlReflectionImporter.ImportElement(TypeModel model, XmlRootAttribute root, String defaultNamespace, RecursionLimiter limiter) 
     at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type, XmlRootAttribute root, String defaultNamespace) 
     at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace) 
     at System.Xml.Serialization.XmlSerializer..ctor(Type type) 
     at Proj.Accounting.Data.XMLObjects.ConvertXmlToClass[T](String xml) in c:\Users\username\Dropbox\Dev\Proj.Accounting\Proj.Accounting.Data\XMLObjects.cs:line 12 
     at Proj.Accounting.Data.MainForm.button1_Click(Object sender, EventArgs e) in c:\Users\username\Dropbox\Dev\Proj.Accounting\Proj.Accounting.Data\MainForm.cs:line 36 
     at System.Windows.Forms.Control.OnClick(EventArgs e) 
     at System.Windows.Forms.Button.OnClick(EventArgs e) 
     at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 
     at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
     at System.Windows.Forms.Control.WndProc(Message& m) 
     at System.Windows.Forms.ButtonBase.WndProc(Message& m) 
     at System.Windows.Forms.Button.WndProc(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&m) 
     at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
     at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
     at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
     at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.Run(Form mainForm) 
     at Proj.Accounting.Data.Program.Main() in c:\Users\username\Dropbox\Dev\Proj.Accounting\Proj.Accounting.Data\Program.cs:line 19 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() InnerException: System.InvalidOperationException HResult=-2146233079 
     Message=Cannot serialize member 'Proj.Accounting.Entity.DocumentStatus.Documents' of type 'System.Collections.Generic.ICollection`1[[Proj.Accounting.Entity.Document, 
Proj.Accounting.Entity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]', see inner exception for more details. 
     Source=System.Xml 
     StackTrace: 
      at System.Xml.Serialization.StructModel.CheckSupportedMember(TypeDesc typeDesc, MemberInfo member, Type type) 
      at System.Xml.Serialization.StructModel.GetPropertyModel(PropertyInfo propertyInfo) 
      at System.Xml.Serialization.StructModel.GetFieldModel(MemberInfo memberInfo) 
      at System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter) 
      at System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter limiter) 
      at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter) 
     InnerException: System.NotSupportedException 
      HResult=-2146233067 
      Message=Cannot serialize member Proj.Accounting.Entity.DocumentStatus.Documents of type 
System.Collections.Generic.ICollection`1[[Proj.Accounting.Entity.Document, 
Proj.Accounting.Entity, Version=1.0.0.0, Culture=neutral, 
PublicKeyToken=null]] because it is an interface. 
      InnerException: 

回答

1

一切说在:

无法序列构件 Proj.Accounting.Entity.DocumentStatus.Documents类型的
System.Collections.Generic.ICollection1 [[Proj.Accounting.Entity.Document, Proj.Accounting.Entity,版本= 1.0.0.0,文化=中性 公钥=空]] ,因为它是一个接口

Interface是不可序列。将所有ICollection属性转换为HashSet以启用这些项目的序列化。

0

序列化

我认为问题是,你的类文件是不是可序列化。当你序列化一个对象时,它们的所有字段也必须是可序列化的。如果你不希望序列化文档成员,将其标记[System.Xml.Serialization.XmlIgnoreAttribute]

序列化一个对象到XML,使用方法序列化和反序列化使用的方法反序列化。你不需要更多。

的更多信息:https://msdn.microsoft.com/es-es/library/system.xml.serialization.xmlserializer(v=vs.110).aspx


提示

此外,改变你的字符串连接使用StringBuilder。如果这是测试代码,请记住您可以在字符串上使用+ =运算符,这将导致清理代码。

例子:

string xml = ""; 
xml = xml + "<?xml version=\"1.0\" encoding=\"UTF - 8\"?>"; 
xml = xml + "<root>"; 

使用+ =运算符(同样的结果,但更清洁)

string xml = ""; 
xml += "<?xml version=\"1.0\" encoding=\"UTF - 8\"?>"; 
xml += "<root>"; 

使用的StringBuilder(最佳和最快的方式)

StringBuilder xml = new StringBuilder(); 
xml.Append("<?xml version=\"1.0\" encoding=\"UTF - 8\"?>"); 
xml.Append("<root>");