C# AspNetUsers(标识)与自定义表之间的一对多关系

C# AspNetUsers(标识)与自定义表之间的一对多关系,c#,mysql,entity-framework,asp.net-mvc-5,asp.net-identity-2,C#,Mysql,Entity Framework,Asp.net Mvc 5,Asp.net Identity 2,我不顾一切地试图在身份2.0的AspNetUsers表和名为Map的自定义表之间创建一对多关系(一个用户可以有多个地图,但一个地图只能有一个用户)。我尝试了这个网站上的所有可用解决方案,也花了很多天尝试在web上找到的其他解决方案。我卡住了。对我来说似乎什么都不管用。我是MVC和EF的新手,所以基本上我认为我需要一些循序渐进的指导。任何人都可以很好地为我提供一个新手指南,从一个新制作的MVC5项目实现这一点。谢谢,很抱歉我提出了一个多余的问题 另外,我可以而且我成功地在两个自定义表之间创建各种类

我不顾一切地试图在身份2.0的AspNetUsers表和名为Map的自定义表之间创建一对多关系(一个用户可以有多个地图,但一个地图只能有一个用户)。我尝试了这个网站上的所有可用解决方案,也花了很多天尝试在web上找到的其他解决方案。我卡住了。对我来说似乎什么都不管用。我是MVC和EF的新手,所以基本上我认为我需要一些循序渐进的指导。任何人都可以很好地为我提供一个新手指南,从一个新制作的MVC5项目实现这一点。谢谢,很抱歉我提出了一个多余的问题

另外,我可以而且我成功地在两个自定义表之间创建各种类型的关系,但不能在AspNetUsers和我的Map表之间创建。提前非常感谢。


这篇文章包含了你的答案

这是一个带有视觉效果的逐步解决方案(它使用继承):


我在许多项目上都做过这项工作

例如,我有一个从ASPNetUsers到通知的一对多关系。因此,在我的ApplicationUser类的IdentityModels.cs中

public virtual ICollection<Notification> Notifications { get; set; }
默认情况下,EF将创建一个从通知到AspNetUsers的级联删除,这是我不想要的,所以我的上下文类中也有这个

modelBuilder.Entity<Notification>()
    .HasRequired(n => n.ApplicationUser)
    .WithMany(a => a.Notifications)
    .HasForeignKey(n => n.ApplicationUserId)
    .WillCascadeOnDelete(false);
modelBuilder.Entity()
.HasRequired(n=>n.ApplicationUser)
.WithMany(a=>a.notification)
.HasForeignKey(n=>n.ApplicationSerID)
.WillCascadeOnDelete(假);
请记住,AspNetUSers的定义是在IdentityModels.cs中的ApplicationUser类中扩展的,该类由visual Studio生成。然后将其视为应用程序中的任何其他类/表

更新-以下是完整模型的示例

public class ApplicationUser : IdentityUser
{

    [StringLength(250, ErrorMessage = "About is limited to 250 characters in length.")]
    public string About { get; set; }

    [StringLength(250, ErrorMessage = "Name is limited to 250 characters in length.", MinimumLength=3)]
    public string Name { get; set; }

    public DateTime DateRegistered { get; set; }
    public string ImageUrl { get; set; }

    public virtual ICollection<Notification> Notifications { get; set; }

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
}


public class Notification
{
    public int ID { get; set; }

    public int? CommentId { get; set; }

    public string ApplicationUserId { get; set; }

    public DateTime DateTime { get; set; }

    public bool Viewed { get; set; }

    public virtual ApplicationUser ApplicationUser { get; set; }

    public virtual Comment Comment { get; set; }

}
公共类应用程序用户:IdentityUser
{
[StringLength(250,ErrorMessage=“About长度限制为250个字符。”)]
关于{get;set;}的公共字符串
[StringLength(250,ErrorMessage=“名称长度限制为250个字符。”,最小长度=3)]
公共字符串名称{get;set;}
公共日期时间日期注册{get;set;}
公共字符串ImageUrl{get;set;}
公共虚拟ICollection通知{get;set;}
公共异步任务GenerateUserIdentityAsync(用户管理器)
{
//注意authenticationType必须与CookieAuthenticationOptions.authenticationType中定义的类型匹配
var userIdentity=wait manager.CreateIdentityAsync(这是DefaultAuthenticationTypes.ApplicationOkie);
//在此处添加自定义用户声明
返回用户身份;
}
}
公开课通知
{
公共int ID{get;set;}
public int?CommentId{get;set;}
公共字符串applicationSerID{get;set;}
公共日期时间日期时间{get;set;}
公共布尔值{get;set;}
公共虚拟应用程序用户应用程序用户{get;set;}
公共虚拟注释{get;set;}
}

}

我假设您使用的是代码优先的方法。我更喜欢的是尝试为数据库生成一个edmx,然后查看为aspnetuser表生成的类,您会明白的。首先在db级别创建与自定义表的关系itself@meajaygoel我可以问你一些代码吗?看看他非常感谢你的帮助,我很感激,不幸的是我仍然无法实现我想要的。。基本上,我需要创建一个新的Db表(映射),其中AspNetUser之间有一个简单的一对多关系(一个AspNetUser可以有多个映射)。如果你有时间,你能给我一些代码吗?非常感谢。非常感谢你的帮助,我知道,不幸的是,我仍然无法实现我想要的。。基本上,我需要创建一个新的Db表(映射),其中AspNetUser之间有一个简单的一对多关系(一个AspNetUser可以有多个映射)。如果你有时间,你能给我一些代码吗?非常感谢,谢谢。。我想这就是我所需要的,你能给我一个通知模型的完整示例和模型类ApplicationUser的相关代码吗?用户:IdentityUser,我正试图实现同样的目标,但我不能……非常感谢!谢谢!这个周末我会试试的!我是否还必须启用迁移和更新某些内容?是的-所有这些都假设您在迁移时首先使用代码,否则对模型的更改将不会反映在数据库中。希望我没有打扰你,但我是新来的..在你的特殊情况下,我需要更新哪些字段?这对你有用吗?如果是的话,你为什么不接受它作为答案?我现在的处境和你一样。你应该始终记住,这个网站也是未来用户的资源,你不应该自私。如果它对你有帮助,就把它标记为答案。。
public class ApplicationUser : IdentityUser
{

    [StringLength(250, ErrorMessage = "About is limited to 250 characters in length.")]
    public string About { get; set; }

    [StringLength(250, ErrorMessage = "Name is limited to 250 characters in length.", MinimumLength=3)]
    public string Name { get; set; }

    public DateTime DateRegistered { get; set; }
    public string ImageUrl { get; set; }

    public virtual ICollection<Notification> Notifications { get; set; }

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
}


public class Notification
{
    public int ID { get; set; }

    public int? CommentId { get; set; }

    public string ApplicationUserId { get; set; }

    public DateTime DateTime { get; set; }

    public bool Viewed { get; set; }

    public virtual ApplicationUser ApplicationUser { get; set; }

    public virtual Comment Comment { get; set; }

}