[英]Serialize an Entity Framework Entity that has child Collections
我有一個Windows Store應用程序。 我試圖在系統執行掛起和關閉操作時保存狀態。 我正在序列化由實體框架6生成的評估對象。它具有存儲在評估實體的DataServiceCollections中的子實體。 反序列化時,出現以下錯誤:
無法將項目添加到集合中。 當DataServiceContext跟蹤DataServiceCollection中的項目時,在將項目加載到集合中之前無法添加新項目。
我正在使用的序列化功能是:
public static string SerializeObject(object obj)
{
MemoryStream stream = new MemoryStream();
System.Runtime.Serialization.Json.DataContractJsonSerializer ser = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType(), Common.SuspensionManager.KnownTypes);
ser.WriteObject(stream, obj);
byte[] data = new byte[stream.Length];
stream.Seek(0, SeekOrigin.Begin);
stream.Read(data, 0, data.Length);
return Convert.ToBase64String(data);
}
public static T DeserializeObject<T>(string input)
{
System.Runtime.Serialization.Json.DataContractJsonSerializer ser = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(T));
MemoryStream stream = new MemoryStream(Convert.FromBase64String(input));
return (T)ser.ReadObject(stream);
}
對這些函數的調用如下:
在保存狀態下序列化:
e.PageState["SelectedEstimate"] = StringSerializer.SerializeObject(Est);
在還原狀態下反序列化:
Est = StringSerializer.DeserializeObject<Estimate>((string)e.PageState["SelectedEstimate"]);
是否有可以與EF實體一起使用的更好的序列化方法? 任何幫助將不勝感激。
吉姆
這是前一陣子發布的,但我認為這是值得回答的。 答案是不使用實體框架,而只是創建自己的實體。 我將ObservableCollections用於實體的子成員。 EF為您做的一件事是跟蹤狀態。 您可以通過在WCF接口定義中添加枚舉來自己做到這一點:
[DataContract(Name = "RecordState")]
public enum CustomerRecordStateEnum
{
[EnumMember]
Unchanged = 0,
[EnumMember]
Added = 1,
[EnumMember]
Modified = 2,
[EnumMember]
Deleted = 3
}
然后在客戶或任何對象中都有一個RecordState的屬性。
[DataMember]
public Nullable<CustomerRecordStateEnum> RecordState { get; set; }
在生成對象的WCF中,將其初始化為未更改。 在您的客戶端中,生成的對象將實現IPropertyChanged。 您可以對此進行掛鈎,並將狀態設置為已修改。 您只希望在沒有其他操作的情況下執行此操作。 如果已添加或刪除它,而您將狀態更改為已修改,則情況會變得混亂:
void Cust_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName != "RecordState")
{
if (Cust.RecordState == RecordState.Unchanged)
Cust.RecordState = RecordState.Modified;
}
}
創建類的Cust使用后:
Cust.PropertyChanged += Cust_PropertyChanged;
唯一要記住的是,如果從您的應用程序中更新對象(在這種情況下為“必須”),請確保將RecordState設置回RecordState.Unchanged。
這樣做的全部目的是,使用此方案,您可以創建跟蹤其記錄狀態的實體,並在需要保存狀態以進行掛起或其他操作時對其進行序列化。 他們會反序列化就好了。 這樣,在簡歷上,您就不會從服務中加載它們。 從服務加載它們會覆蓋您在本地進行但尚未保存的所有更改。
希望這對某人有用。
吉姆
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.