Я создаю систему управления клиентами. используя Asp.Net MVC5.
Я хочу определить несколько типов пользователей, используя Asp.Net Identity 2.x
Пример:
Клиент, Сотрудник, Филиалы
это не роли, потому что все они имеют разные свойства, некоторые из них одинаковы.
и для аутентификации я хочу использовать Identity User, так как Identity позаботится об остальной части работы с точки зрения авторизации и аутентификации.
Теперь я хочу знать, как определить отношения между ними.
Я пробовал некоторые коды, но я не знаю, насколько это хорошо для запуска этого проекта на Live Server.
Класс IdentityUser
"Identity User создает свойства по умолчанию для пользователя."
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 успешно обновился
а затем получил ошибку при обновлении клиента
как восстановить предыдущую запись appuser.
Как это сделать с хорошей практикой ... Извините, если я не мог сделать это легко понять.
Как определить связь между IdentityUser и Сотрудником / Клиентом / Партнерами