簡體   English   中英

序列化具有子集合的實體框架實體

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM