我可以让entity framework使用具体类而不是接口(用于Web服务序列化)

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

不幸的是,entity framework创建的类包含以下内容:

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

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

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

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

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

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

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

 public partial class Conference { [XmlIgnore] public bool SessionsSpecified { get { return false; } } public Session[] SerializableSessions { get { return new Sessions.ToArray(); } set { Sessions = value; } } } 

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

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

我用过T4模板 。

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

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

 ((IObjectContextAdapter)entities).ObjectContext.ContextOptions.ProxyCreationEnabled = false;