5

我正在学习 Web 服务,我正在使用的书是使用实体框架从 SQL 服务器中提取数据(我对此也知之甚少)。

不幸的是,实体框架创建的类包含以下内容:

public Conference()
{
   this.Sessions = new HashSet<Session>();
}
public virtual ICollection<Session> Sessions { get; set; }

这会导致问题,因为接口不可序列化:

无法序列化 System.Collections.Generic.ICollection ... 类型的成员 X,因为它是一个接口。

现在我可以(并且确实)修改生成的类以使用具体类,但如果我需要重新生成实体,那么该更改将被撤消。理想情况下,我可以告诉实体框架生成这样的东西(或者更好的是,控制具体类型,这样我可以告诉实体框架使用 List 如果我愿意):

public Conference()
{
   this.Sessions = new HashSet<Session>();
}
public virtual HashSet<Session> Sessions { get; set; }

可能吗?如果是这样,怎么做?

4

2 回答 2

0

EF 代码生成器将实体类创建为partial,因此您可以使用一些技巧在同一程序集中创建另一个代码文件:

public partial class Conference
{
    [XmlIgnore]
    public bool SessionsSpecified
    {
        get { return false; }
    }

    public Session[] SerializableSessions
    {
        get { return new Sessions.ToArray(); }
        set { Sessions = value; }
    }
}

SessionSpecified 属性是一个 XmlSerializer技巧,用于在序列化期间忽略 Sessions 属性。Session[] 将被序列化而不是 ICollection。检查是否可以公开内部 EF 集合类型以使用强制转换而不是复制数组。

另一种解决方案是实现IXmlSerializable并完全控制 Conference 类的序列化方式。

于 2014-02-09T14:26:52.433 回答
0

我使用了 T4 模板

在模板中,我更改ICollectionList,并添加[Serializable]到实体类型和复杂类型。

我还必须禁用代理类型生成:

((IObjectContextAdapter)entities).ObjectContext.ContextOptions.ProxyCreationEnabled = false;
于 2015-07-15T09:30:57.967 回答