Как определить другой тип пользователей в Asp.Net MVC5 с помощью EF Code First - PullRequest
1 голос
/ 11 июня 2019

Я создаю систему управления клиентами. используя 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 и Сотрудником / Клиентом / Партнерами

...