. Net core EF, сохранение записей в таблице типа «многие ко многим» - PullRequest
0 голосов
/ 26 марта 2020

Я новичок в EF и. Net core, и у меня проблемы с отношениями "многие ко многим" в моем проекте. Я использовал документацию Microsoft для настройки отношений, но у меня проблемы с вставкой каких-либо данных. Проект - это доска kanban, и я пытаюсь установить отношения между пользователями и задачами. Оба они уже существуют. Цель состоит в том, чтобы иметь таблицу с userId и taskId. Вот мои модели:

KanbanTask Модель:

public class KanbanTask : Entity
    {
        public string Title { get; set; }
        [Required]
        public string Description { get; set; }
        [Required] 
        public string Status { get; set; }
        public int ProgressStatus { get; set; }
        public List<UserTask> UserTask { get; set; }
    }

Модель пользователя:

public class User : Entity
    {
        [Required]
        public string Name { get; set; }
        [Required]
        public string Surname { get; set; }
        public List<UserTask> UserTask { get; set; }
    }

Модель объекта:

public class Entity
{
    public int Id { get; set; }
}

UserTaskModel:

public class UserTask
    {
        public int UserId { get; set; }
        public User User { get; set; }
        public int KanbanTaskId { get; set; }
        public KanbanTask KanbanTask { get; set; }
    }

Мой DbContex:

public DbSet<KanbanTask> KanbanTasks { get; set; }
    public DbSet<User> Users { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<UserTask>()
            .HasKey(t => new { t.UserId, t.KanbanTaskId });

        modelBuilder.Entity<UserTask>()
            .HasOne(pt => pt.User)
            .WithMany(p => p.UserTask)
            .HasForeignKey(pt => pt.UserId);

        modelBuilder.Entity<UserTask>()
            .HasOne(pt => pt.KanbanTask)
            .WithMany(t => t.UserTask)
            .HasForeignKey(pt => pt.KanbanTaskId);
    }
}

Моя функция в обслуживании:

 public async Task<ResultDTO> AssignTaskToUser(int taskId, int userId)
        {
            var result = new ResultDTO()
            {
                Response = null
            };
            try
            {
                var user = await _repo.GetSingleEntity(x => x.Id == userId);
                var kanbanTask = await _taskrepo.GetSingleEntity(y => y.Id == taskId);
                if (user != null && kanbanTask != null)
                {
                    var usertask = new UserTask()
                    {
                        KanbanTaskId = taskId,
                        UserId = userId
                    };
                    kanbanTask.UserTask.Add(usertask);
                    user.UserTask.Add(usertask); 
                    await _repo.Patch(user);
                }
                else
                    result.Response = "Task or user not found";
            }
            catch (Exception e)
            {
                result.Response = e.Message;
                return result;
            }
            return result;
        }

Мой репозиторий:

public async Task Patch(T entity)
        {
            _dbSet.Update(entity);
            await _context.SaveChangesAsync();
        }

1 Ответ

1 голос
/ 26 марта 2020

Как это

var usertask = new UserTask()
                    {
                        KanbanTaskId = taskId,
                        UserId = userId
                    };
db.UserTasks.Add(usertask);
db.SaveChanges();
...