我的应用程序中有这个实体和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对象可以解决我的问题,但现在我被卡住了。
有什么想法吗?
答案 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。万一你不这样做。
中此评论中的链接进行操作如果模式是SQL Server,则存储在会话状态中的对象必须是可序列化的。有关可序列化对象的信息,请参阅SerializableAttribute类。