【问题标题】:Serialization issue with entity framework and sql session state实体框架和 sql 会话状态的序列化问题
【发布时间】:2015-12-09 01:51:42
【问题描述】:

我的应用程序上有这个实体和 dbcontext:

[Serializable, Table("calc.Student")]
public class Student
{
    public int Id { get; set; }
}

public StudentDbContext() : base("name=DefaultConnection") 
{ 

}

public DbSet<Student> Students { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}

我的 DTO 课程:

[Serializable]
public class StudentDTO
{
    public int Id { get; set; }
}

我的 api 控制器:

public IQueryable<StudentDTO> Get()
{
    var students = from b in db.Students
                   select new StudentDTO()
                   {
                       Id = b.Id
                   };
    return students ;
}

现在我的问题是我的会话状态。在我的 web.config 文件中,我陈述了下面的代码,以便我可以将我的会话存储在数据库中:

<sessionState mode="SQLServer" allowCustomSqlDatabase="true" cookieless="false"

使用这行代码,我收到此错误:

无法序列化会话状态。在“状态服务器”和 'SQLServer' 模式,ASP.NET 将序列化会话状态对象, 结果是不可序列化的对象或 MarshalByRef 对象 不允许。如果类似的序列化,同样的限制适用 由自定义会话状态存储在“自定义”模式下完成。

我认为返回 DTO 对象可以解决我的问题,但现在我被卡住了。

有什么想法吗?

【问题讨论】:

  • 不完全确定 api 调用如何与您的 会话状态 基于此代码 - 但是,您可能会幸运地将其更改为返回 List&lt;StudentDTO&gt; 而不是 @ 987654326@
  • 此外,带有 EF 代理的类是可序列化的(急切加载),因此您不需要 DTO 对象。就像 Rob 说的,看这段代码,问题可能是 IQueryable.

标签: c# asp.net-mvc entity-framework session serialization


【解决方案1】:

我忘了在这里回答我的问题,但以防其他人遇到同样的问题。

原因是我的StudentRepository 课程下面的这一行。

StudentDbContext context = new StudentDbContext();

即使StudentRepository[Serializable] 的签名,它也有不能被序列化的成员。

解决方法是只在方法内声明上下文。

public IEnumerable<Student> GetAllStudent()
{
    using (var context = new StudentDbContext())
    {

    }
}

无需使用DTO object

【讨论】:

    【解决方案2】:

    这与 EF 无关。如前所述,您显示问题的错误是您尝试将对象存储在 Session 中,该对象无法序列化或者是 MarshalByRef 对象。

    您需要找到有问题的Session["xyz"] = myObject; 并使myObject 的类可序列化。

    此外,您需要将服务器配置为允许 SQL Server 会话状态:HOW TO: Configure SQL Server to Store ASP.NET Session State。以防万一你没有。

    请点击Session-State Modes的评论中的链接:

    如果模式是 SQL Server,则存储在会话状态中的对象必须是可序列化的。有关可序列化对象的信息,请参阅SerializableAttribute 类。

    【讨论】:

      猜你喜欢
      • 2011-05-02
      • 2015-04-28
      • 2013-05-20
      • 2014-10-08
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多