我正在学习 Web 服务,我正在使用的书是使用 Entity Framework (我对此也知之甚少)从 SQL Server 中提取数据。
不幸的是, Entity Framework 创建的类包含如下内容:
public Conference()
{
this.Sessions = new HashSet<Session>();
}
public virtual ICollection<Session> Sessions { get; set; }
这会导致问题,因为接口(interface)不可序列化:
Cannot serialize member X of type System.Collections.Generic.ICollection ... because it is an interface.
现在我可以(并且确实)修改生成的类以使用具体类,但如果我需要重新生成实体,那么该更改将被撤消。理想情况下,我可以告诉 Entity Framework 生成这样的东西(或者更好的是,控制具体类型,这样我就可以告诉 Entity Framework 使用列表,如果我愿意的话):
public Conference()
{
this.Sessions = new HashSet<Session>();
}
public virtual HashSet<Session> Sessions { get; set; }
这可能吗?如果是,怎么办?
最佳答案
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并完全控制 session 类的序列化方式。
关于c# - 我能否让 Entity Framework 使用具体类而不是接口(interface)(用于 Web 服务序列化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17625551/