我正在使用具有自己上下文的Identity。

public class ApplicationUser : IdentityUser {
    // some custom fields
}

public class IdentityContext : IdentityDbContext<ApplicationUser> {
   //...
}


我也有其他这样的实体

public class Comment{
   public int Id {get;set;}
   public string Message{get;set;}
   public DateTime Time{get;set;}
}


在我的其他上下文中使用

public class MyContext :DbContext {
   public DbSet<Comment> Comments { get; set; }
   //... other DbSets
}


题。我希望我的Comment实体具有author属性,所以我会得到类似

public class Comment{
   public int Id {get;set;}
   public string Message{get;set;}
   public DateTime Time{get;set;}
   public virtual ApplicationUser Author {get;set;}
}


但是ApplicationUser位于同一数据库中的不同上下文中。我敢打赌这是不可能的。

如何正确实现呢?
我应该将DbSet从MyContext移到IdentityContext,这样我可以自由地使用这样的代码

public virtual ApplicationUser Author {get;set;}


还是应该让它处于不同的上下文中,但添加类似

public string AuthorId {get;set}


并采取一些变通办法,以便在每次需要时从不同的上下文中获取作者信息?或者是其他东西?

谢谢



编辑

好的,我最终得到这样的结果:

public class ApplicationUser : IdentityUser {
        public virtual UserProfile UserProfile { get; set; }
}

public class UserProfile {
        [Key, ForeignKey("ApplicationUser")]
        public string Id { get; set; }
        //... custom fields
        public virtual ApplicationUser ApplicationUser { get; set; }

}

public class IdentityContext : IdentityDbContext<ApplicationUser> {
        //...
        public DbSet<UserProfile> UserProfiles { get; set; }
 }


但是我应该如何实现Comment的作者参考呢?像这样?因此,它不会通过EF关系进行链接,而我自己将UserProfileId填充到代码中的某个地方吗?

public class Comment{
   public int Id {get;set;}
   public string UserProfileId{get;set;}
}


这是正确的方法吗?

最佳答案

问自己一个问题,ApplicationUser可以在业务模型中使用哪些信息?如果是这样,那是存放它的正确位置吗?还是只想链接用户?


  虽然ApplicationUser位于同一数据库中,但位于不同的上下文中。


但是现在假设不是。假设您将来希望使用类似IdentityServer之类的东西。

我认为最好的方法是使您的业务信息与身份信息分开。我不想将登录信息公开给企业,以免可能被读取或更改。

我已经看到了在ViewModel中将ApplicationUser(作为业务上下文的一部分)发送给客户端(包括HashPassword)的代码。确定要阻止的事情。

您可以做的是在MyContext中添加一个User表来存储要使用的数据。 ApplicationUser没有您想要的业务模型中的任何信息。

我假设您只想将信息链接到用户。您想从Entiy Framework的对象链接中受益。

因此,创建一个User表并向ApplicationUser添加一个属性以存储User表的UserId。或者,您也可以进行其他链接:将ApplicationUserId添加到User表中。也可以对两者使用相同的ID:自己设置ApplicationUser.Id(不必是guid)或将生成的guid用于User.Id。

如果您要使用身份上下文中的某些其他信息,例如EmailAddress,您可以考虑添加声明。

-更新-

想法是将用户表添加到您的上下文中,而不是身份上下文中。为了更清楚一点,我将称呼表Person(不是user)。请注意,Person不继承IdentyUser / ApplicationUser。

public class Person {
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    //etc..
    public string ApplicationUserId { get; set; }
}

public class MyContext :DbContext {
   public DbSet<Comment> Comments { get; set; }
   public DbSet<Person> Persons { get; set; }
   //... other DbSets
}

public class Comment{
   public int Id {get;set;}
   public string Message{get;set;}
   public DateTime Time{get;set;}
   public virtual Person Author {get;set;}
}


现在,当我查询当前用户的所有注释时,我可以查找Person.Id(基于User.Identity.GetUserId())。

创建登录名时,请不要忘记添加一个人。

我希望这有帮助。如果没有,请告诉我。

关于c# - 如何正确实现其他实体对身份用户的引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43825825/

10-09 03:56