序列化具有子集合的实体框架实体

时间:2013-12-06 14:24:52

标签: c# entity-framework serialization windows-store-apps

我有一个Windows应用商店应用。我试图在系统暂停和关闭时保存状态。我正在序列化由实体框架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实体一起使用?任何帮助将不胜感激。

吉姆

1 个答案:

答案 0 :(得分:0)

这是一段时间后发布的,但我觉得它值得回答。答案是不使用Entity Framework,只创建自己的实体。我使用ObservableCollections作为我实体的子成员。 EF为你做的一件事是跟踪状态。您可以通过在WCF接口定义中添加枚举来自己完成此操作:

[DataContract(Name = "RecordState")]
public enum CustomerRecordStateEnum
{
    [EnumMember]
    Unchanged = 0,
    [EnumMember]
    Added = 1,
    [EnumMember]
    Modified = 2,
    [EnumMember]
    Deleted = 3
}

然后在Customer或任何具有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;

唯一要记住的是,如果从您的应用程序更新对象(在本例中为Cust),请确保将RecordState设置回RecordState.Unchanged。

这一点的重点在于,使用此场景,您可以创建跟踪其记录状态的实体,并在需要保存暂停状态或其他情况时序列化它们。他们将反序列化就好了。这样,在简历上,您不会从服务中加载它们。从服务中加载它们会覆盖您在本地所做的任何更改,但尚未保存。

希望这对某人有用。

吉姆

相关问题