' Microsoft.AspNet.Identity.EntityFramework.IdentityUser'未标记为可序列化

时间:2015-09-17 21:49:41

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

我正在一个系统中实现ASP.NET Identity,其中使用带有实体框架的用户模型进行身份验证,并通过Session在WebApp中进行控制(是的,它是Web表单中的遗留系统),我们实现了,替换了{{1通过身份User建模,一切正常。

问题是,有一个通知系统,它基本上是ApplicationUserNotification模型之间的多对多关系, 这些通知与SQL系统的其余部分一起保存在SQL Server中,但也在Cache Redis中以便更快地读取,并且需要序列化以便在其上进行写入。我们移除User模型,然后在User模型中添加ICollection ApplicationUser,反之亦然 - 在两者之间建立关联。

但是Notification继承自ApplicationUser,甚至添加了注释IdentityUser我得到了例外:

  

键入' Microsoft.AspNet.Identity.EntityFramework.IdentityUser'该   assembly' Microsoft.AspNet.Identity.EntityFramework,Version =   2.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'未标记为可序列化

我的问题是,有没有办法序列化这个?或者我必须创建另一个用户模型才与通知模型相关联?

[Serializable]模型

ApplicationUser

[Serializable] public class ApplicationUser : IdentityUser { public ApplicationUser() { this.Notificacoes = new List<Notificacao>(); } public ClaimsIdentity GenerateUserIdentity(IdentityConfig.ApplicationUserManager manager) { var userIdentity = manager.CreateIdentity(this, DefaultAuthenticationTypes.ApplicationCookie); return userIdentity; } public Task<ClaimsIdentity> GenerateUserIdentityAsync(IdentityConfig.ApplicationUserManager manager) { return Task.FromResult(GenerateUserIdentity(manager)); } public bool ReceiveNotifications { get; set; } public int Permission { get; set; } public virtual ICollection<Notificacao> Notificacoes { get; set; } } 模型

Notification

Serialize用于将对象序列化为Redis的方法(它抛出异常的地方)

[Serializable]
public partial class Notificacao
{
    public Notificacao()
    {
        this.Usuarios = new List<ApplicationUser>();
    }

    public int Codigo { get; set; }
    public string Mensagem { get; set; }
    public DateTime DataHoraNotificacao { get; set; }
    public int Tipo { get; set; }
    public virtual ICollection<ApplicationUser> Usuarios { get; set; }

}

2 个答案:

答案 0 :(得分:1)

由于您无法控制包含IdentityUser类的程序集,因此无法完成此操作。另一种解决方案可能是在缓存之前将对象映射到Dto(数据传输对象),反之亦然。

有关该主题的其他主题(与WCF相关但仍涉及序列化IdentityUser):

asp-net-mvc-5-identityuser-in-wcf

how-do-i-serialize-an-identityuser-reference-in-web-api-2-2

答案 1 :(得分:1)

您不希望将 IdentityUser 或其任何子类序列化到数据库中。周期。

如果您需要在数据库中维护关系,请创建 POCO (普通旧CLR对象 - 简单来说,一个自定义类)。

此外,如果您需要在用户类中随身携带 IdentityUser ,请使用合成而不是继承。这意味着,不要从 IdentityUser 继承,而是在您的类中创建它的属性。并将该属性标记为 NonSerializable