实体框架和sql会话状态的序列化问题

时间:2015-12-09 01:51:43

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

我的应用程序中有这个实体和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"

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

  

无法序列化会话状态。在&#39; StateServer&#39;和   &#39; SQLServer的&#39;模式,ASP.NET将序列化会话状态对象,   因此,不可序列化的对象或MarshalByRef对象是   不允许。如果类似的序列化,则适用相同的限制   由自定义会话状态存储在&#39; Custom&#39;中完成。模式。

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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我忘记在这里提供我的问题的答案,但是如果其他人遇到同样的问题。

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

StudentDbContext context = new StudentDbContext();

即使StudentRepository的签名为[Serializable],它也有无法序列化的成员。

修复只是在方法中声明上下文。

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

    }
}

无需使用DTO object

答案 1 :(得分:0)

这与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类。