我正在创建客户管理系统。使用Asp.Net MVC5。 我想使用Asp.Net Identity 2.x定义多种类型的用户 例如: 客户,员工,会员 这些不是角色,因为它们都具有不同的属性,其中一些是相同的。 对于身份验证,我想使用身份用户,因为身份将负责授权和身份验证方面的其余工作。 现在我想知道如何定义它们之间的关系。
我尝试了一些代码,但是我不知道在Live Server上运行该项目是否很好。
“身份用户为用户创建默认属性。”
public class AppUser : IdentityUser<string, AppUserLogin, AppUserRole, AppUserClaim>, IUser<string>
{
public AppUser()
{
this.Id = Guid.NewGuid().ToString();
}
public async Task<ClaimsIdentity>
GenerateUserIdentityAsync(UserManager<AppUser, string> manager)
{
var userIdentity = await manager
.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
return userIdentity;
}
}
public class Client
{
public string AppUserId { get; set; }
[ForeignKey("AppUserId")]
public virtual AppUser AppUser { get; set; }
public int? EmployeeId { get; set; }
[ForeignKey("EmployeeId")]
public virtual Employee Employee{ get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string PhoneNumber { get; set; }
public Nullable<DateTime> DOB { get; set; }
}
public class Employee
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string PhoneNumber { get; set; }
public Nullable<DateTime> DOB { get; set; }
public IList<Client> Clients { get; set; }
public string AppUserId { get; set; }
[ForeignKey("AppUserId")]
public virtual AppUser AppUser { get; set; }
[NotMapped]
public IList<string> UserRoles{ get; set; }
}
public class Affiliate
{
public string CompanyName { get; set; }
public string Status { get; set; }
public decimal Commission { get; set; }
public string AppUserId { get; set; }
[ForeignKey("AppUserId")]
public virtual AppUser AppUser { get; set; }
}
现在这些是我的用户类型及其关系,
当我创建任何用户时,
例如:
var client = new client();
client.FirstName = "abc";
client.LastName = "xyz";
client.AppUser.Email = "abc@example.com";
client.AppUser.UserName = "abc@example.com";
client.AppUser.Password= "123456";
var db = new myContext();
db.client.add(client);
它也可以正常工作。
问题是当我更新记录时 所以我必须更新两个实体, 我无法一次更新两个实体, 我必须先更新AppUser 1,然后再更新客户/员工 或客户/员工,然后是AppUser。
我不知道如何编写更好的代码来成功更新两个实体 因为我无法更新 例如:
public JsonResult Update(Client cm)
{
var db = new myContext();
//var client = db.clients.where(x=>x.Id == cm.Id).firstordefault();
var client = db.clients.find(cm.Id);
client.FirstName = cm.FirstName;
client.LastName = cm.LastName ;
client.AppUser.Email = cm.Email;
client.AppUser.UserName = cm.Email;
client.AppUser.Password= cm.Password;
db.Entry(client).State = System.Data.Entity.EntityState.Modified;
return Context.SaveChanges() > 0;
}
它引发错误
IEntityChangeTracker的多个实例不能引用一个实体对象。在多个条目上
我试图分别更新两个实体,
例如:
更新AppUser 我使用了UserManager
public JsonResult Update(Client cm)
{
var db = new myContext();
//var client = db.clients.where(x=>x.Id == cm.Id).firstordefault();
var client = db.clients.find(cm.Id);
var appUser = UserManager.Find(cm.AppUserId);
client.FirstName = cm.FirstName;
client.LastName = cm.LastName ;
appUser.Id = cm.AppUserId;
appUser.Email = cm.Email;
appUser.UserName = cm.Email;
appUser.Password= cm.Password;
UserManager.Update(appUser);
db.Entry(client).State = System.Data.Entity.EntityState.Modified;
Context.SaveChanges();
}
这是我想知道appUser是否成功更新的要点 然后在更新客户端时出错 如何检索应用程序用户先前的记录。
如何通过良好的实践做到这一点..对不起,如果我听不懂。
如何定义IdentityUser与员工/客户/关联公司之间的关系