我正在使用具有自己上下文的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/