& # 39; Microsoft.AspNet.Identity.EntityFramework.IdentityUs

本文关键字:Identity EntityFramework IdentityUs AspNet Microsoft | 更新日期: 2023-09-27 18:13:09

我正在实现ASP。. NET Identity在一个使用带有实体框架的用户模型进行身份验证的系统中,并在WebApp中由Session控制(是的,它是一个遗留系统到web表单),我们实现了,用身份的ApplicationUser取代了User模型,一切正常。

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

ApplicationUser继承自IdentityUser,甚至添加注释[Serializable]我得到例外:

Microsoft.AspNet.Identity.EntityFramework类型"。IdentityUser"Microsoft.AspNet.Identity大会"。实体框架,版本=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模型

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

Serialize用于将对象序列化到Redis的方法(会抛出异常)

static byte[] Serialize(object o)
{
    if (o == null)
    {
        return null;
    }
    BinaryFormatter binaryFormatter = new BinaryFormatter();
    using (MemoryStream memoryStream = new MemoryStream())
    {
        binaryFormatter.Serialize(memoryStream, o);
        byte[] objectDataAsStream = memoryStream.ToArray();
        return objectDataAsStream;
    }
}

& # 39; Microsoft.AspNet.Identity.EntityFramework.IdentityUs

您不希望将IdentityUser或它的任何子类序列化到数据库。时期。

如果你需要维护数据库中的关系,创建一个POCO (Plain Old CLR Object -简而言之,一个自定义类)。

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

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

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

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

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