【问题标题】:Can I get the entity framework to use concrete classes instead of interfaces (for web service serialisation)我可以让实体框架使用具体类而不是接口(用于 Web 服务序列化)
【发布时间】:2013-07-11 14:58:38
【问题描述】:

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

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

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; }

有可能吗?如果有,怎么做?

【问题讨论】:

标签: c# .net entity-framework


【解决方案1】:

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 并完全控制 Conference 类的序列化方式。

【讨论】:

    【解决方案2】:

    我用T4 template

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多