我正在学习Web服务,我正在使用的书是使用实体框架从SQL服务器中提取数据(我对此也知之甚少)。
不幸的是,实体框架创建的类包含以下内容:
public Conference()
{
this.Sessions = new HashSet<Session>();
}
public virtual ICollection<Session> Sessions { get; set; }
由于界面不可序列化导致问题:
无法序列化类型的成员X. System.Collections.Generic.ICollection ...因为它是一个接口。
现在我可以(并且确实)修改生成的类以使用具体类,但如果我需要重新生成实体,则该更改将被撤消。理想情况下,我可以告诉实体框架生成这样的东西(或者甚至更好,控制具体类型,以便我可以告诉实体框架如果我想要使用List):
public Conference()
{
this.Sessions = new HashSet<Session>();
}
public virtual HashSet<Session> Sessions { get; set; }
有可能吗?如果是这样,怎么样?
答案 0 :(得分: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 trick,用于在序列化期间忽略Sessions属性。 Session []将被序列化而不是ICollection。检查是否可以公开内部EF集合类型以使用强制转换而不是复制数组。
替代解决方案是实施IXmlSerializable并完全控制会议类序列化的方式。
答案 1 :(得分:0)
我使用T4 template。
在模板中,我将ICollection
更改为List
,并将[Serializable]
添加到实体类型和复杂类型。
我还必须禁用代理类型生成:
((IObjectContextAdapter)entities).ObjectContext.ContextOptions.ProxyCreationEnabled = false;