ef核心可能要进行许多更新,并额外提交文件 [英] ef core may to many update with extra filed

查看:77
本文介绍了ef核心可能要进行许多更新,并额外提交文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的模式类:

public class AccountCustomer
{    
        public bool IsMain { get; set; }
        public int AccountId { get; set; }
        public Account Account { get; set; }

        public int CustomerId { get; set; }
        public Customer Customer { get; set; } 
}

public class Account
{    
       
        public int Id { get; set; }
         public strig No{ get; set; }
        ..other fields
       public ICollection<AccountCustomer> AccCustomer { get; set; } = new List<AccountCustomer>();
}

public class Customer
{    
       
        public int Id { get; set; }
         public strig Name{ get; set; }
        ..other fields
    public ICollection<AccountCustomer> AccCustomer { get; set; } = new List<AccountCustomer>();
}

我在这里找到了解决方案,后来我也实现了同样的解决方案,我发现它不需要额外的列

I found soluton here and i have implemented same later i found that it is for without extra column

很多到很多ef核心更新

请让我知道如何进行更新...正在使用最新的ef 5预览

Please let meknow how to do update... Am using latest ef 5 preview

我的代码:

_context.Set<AccountCustomer>().UpdateLinks(ac => ac.AccountId, account.Id,
                ac => ac.CustomerId, account.AccCustomer .Select(ac => ac.CustomerId));


推荐答案

ManyToMany更新扩展代码


删除未选择的项目并将新项目添加到列表中。

Codes of ManyToMany Update Extensions

Remove the unselected item and add new item to list.

public static class Extensions
{ 

    public static void TryUpdateManyToMany<T, TKey>(this DbContext db, IEnumerable<T> currentItems, IEnumerable<T> newItems, Func<T, TKey> getKey) where T : class
    {
        db.Set<T>().RemoveRange(currentItems.ExceptThat(newItems, getKey));
        db.Set<T>().AddRange(newItems.ExceptThat(currentItems, getKey));
    }

    private static IEnumerable<T> ExceptThat<T, TKey>(this IEnumerable<T> items, IEnumerable<T> other, Func<T, TKey> getKeyFunc)
    {
        return items
            .GroupJoin(other, getKeyFunc, getKeyFunc, (item, tempItems) => new { item, tempItems })
            .SelectMany(t => t.tempItems.DefaultIfEmpty(), (t, temp) => new { t, temp })
            .Where(t => ReferenceEquals(null, t.temp) || t.temp.Equals(default(T)))
            .Select(t => t.t.item);
    }
}


更新ViewModel的代码


Codes of Update ViewModel

The update view pass it to action via request.

public class AccountCustomerVM
{
    public bool IsMain { get; set; }
    public Account Account { get; set; }
    public List<int> Customers { get; set; }
}


更新操作代码


    [HttpPut]
    public IActionResult Update(AccountCustomerVM accountCustomerVM)
    {
        var model = _context.Accounts.Include(x => x.AccCustomer).FirstOrDefault(x => x.Id == accountCustomerVM.Account.Id);
        _context.TryUpdateManyToMany(model.AccCustomer, accountCustomerVM.Customers
            .Select(x => new AccountCustomer
            {
                IsMain = accountCustomerVM.IsMain,
                CustomerId = x,
                AccountId = accountCustomerVM.Account.Id
            }), x => x.CustomerId);
        _context.SaveChanges();
        return Ok();
    }

这篇关于ef核心可能要进行许多更新,并额外提交文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆