c# - 我能否让 Entity Framework 使用具体类而不是接口(interface)(用于 Web 服务序列化)

标签 c# .net entity-framework

我正在学习 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/

相关文章:

.net - ServiceRoute + WebServiceHostFactory 杀死 WSDL 生成?如何使用 ?wsdl 创建无扩展 WCF 服务

entity-framework - Entity Framework Core 2.0 - 逐步运行迁移

c# - 单击 DataGridCell 时的 WPF 触发事件

c# - DbExpressionBinding 需要一个带有集合 ResultType 的输入表达式

c# - 如何检查Redis channel 是否已通过StackExchange.Redis订阅?

entity-framework - 如何使用 Code-First 注释父子关系

c# - 在 lucene 搜索之前,我如何通过外键过滤我的数据?

64位windows下的C# 32位项目

C# .NET 正则表达式问题

c# - 查找服务设置为哪个帐户 "Log On As"