簡體   English   中英

.Net core EF,將記錄保存到多對多類型表

[英].Net core EF, saving records to many-to-many type table

我是 EF 和 .Net 核心的新手,我在我的項目中遇到了多對多關系的問題。 我使用微軟文檔來設置關系,但我無法插入任何數據。 項目是一個看板,我正在嘗試建立用戶和任務之間的關系。 兩者都已經存在。 目標是擁有一個包含 userId 和 taskId 的表。 這是我的模型:

看板任務模型:

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; }
}

用戶任務模型:

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

我的數據庫上下文:

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();
        }

像這樣

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

您需要的是確保您的中間實體 (UserTask) 始終保存兩個實體的鍵,因此我強烈建議在 UserTask 構造函數中添加該邏輯。

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

 public UserTask() { }

 public UserTask(User user, KanbanTask kanbanTask) 
 {
    KanbanTask = kanbanTask;
    KanbanTaskId = kanbanTask.Id;
    User = user;
    UserId = userId;
  }
}

//

                var usertask = new UserTask(user, kanbanTask);
                kanbanTask.UserTask.Add(usertask);
                user.UserTask.Add(usertask); 
                await _repo.Patch(user);

//

我為這個常見問題寫了一個例子。 在這里https://github.com/salsita18/ManyToManyNetCore您可以檢查我采用的方法,使用單個通用 MiddleEntity 類。 我還將它添加到 nuget 以便重用它,但是您可以按照模式進行自己的實現

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM