C# 如何在实体框架中更新多对多表

C# 如何在实体框架中更新多对多表,c#,entity-framework,linq,C#,Entity Framework,Linq,我有三张桌子: 新闻 public partial class News { public News() { this.Categories = new HashSet<Category>(); } public int NewsId { get; set; } public string NewsTitle { get; set; } public string NewsBody { get; set; }

我有三张桌子:

新闻

public partial class News
{
    public News()
    {
        this.Categories = new HashSet<Category>();
    }

    public int NewsId { get; set; }
    public string NewsTitle { get; set; }
    public string NewsBody { get; set; }
    public System.DateTime NewsDate { get; set; }
    public string NewsImagePath { get; set; }

    public virtual ICollection<Category> Categories { get; set; }
}

您必须直接处理新闻集和分类。添加或删除这些集合的实体。之后,您必须保存新闻和类别实体。例如:

        var category = new Category();
        var news = new News();
        var removedNews = new News();
        var newCategory = new Category();

        category.News.Remove(removedNews);
        news.Categories.Add(newCategory);
        //to do save category and news

您希望使用DbContext直接对实体模型进行更改,然后保存更改。LINQTO实体将负责SQL语句。下面的示例将帮助您找到正确的方法来实现这一点。您不应该编写任何SQL语句

// Replace with your real model from MVC
var model = new Model { SelectedCategoriesIds = new List<int>() };
model.SelectedCategoriesIds.Add(1);
model.SelectedCategoriesIds.Add(2);
model.SelectedCategoriesIds.Add(3);

var newsToUpdate = new News {  Categories = new List<Category>() }; // Replace with your call to database

// Use an Entity Framework context to update our db model
using (var dbContext = new MyDbContext())
{
    // First clear existing categories
    newsToUpdate.Categories.Clear();

    // Now add selected categories
    foreach (var selectedCategory in model.SelectedCategoriesIds)
    {
        var dbCat = dbContext.Categories.Single(c => c.Id == selectedCategory);
        newsToUpdate.Categories.Add(dbCat);
    };

    // Save changes
    dbContext.SaveChanges();
}
//替换为MVC中的真实模型
var模型=新模型{SelectedCategoriesID=新列表()};
model.SelectedCategoriesIds.Add(1);
model.SelectedCategoriesIds.Add(2);
model.SelectedCategoriesIds.Add(3);
var newsToUpdate=新新闻{Categories=新列表()};//替换为对数据库的调用
//使用实体框架上下文来更新我们的数据库模型
使用(var dbContext=new MyDbContext())
{
//首先,明确现有类别
newsToUpdate.Categories.Clear();
//现在添加选定的类别
foreach(模型中的变量selectedCategory.SelectedCategoriesId)
{
var dbCat=dbContext.Categories.Single(c=>c.Id==selectedCategory);
newsToUpdate.Categories.Add(dbCat);
};
//保存更改
dbContext.SaveChanges();
}

从DbContext中获取新闻对象。对类别列表进行任何更改,然后调用DbContext.SaveChanges();谢谢你的帮助。。。我试着证明它不起作用。。。你能用我的代码告诉我怎么做吗?你能告诉我第三张表的属性吗?还是只有两个ID字段?@tCoe是的,只有两个ID NewsId和CategoryId@Lucia不用担心第三个表,Entity Framework已经使用虚拟ICollection类别映射了该关系。只需操作该属性中的项并保存更改。EF将处理多对多表的SQL。见下面我的答案。
        var category = new Category();
        var news = new News();
        var removedNews = new News();
        var newCategory = new Category();

        category.News.Remove(removedNews);
        news.Categories.Add(newCategory);
        //to do save category and news
// Replace with your real model from MVC
var model = new Model { SelectedCategoriesIds = new List<int>() };
model.SelectedCategoriesIds.Add(1);
model.SelectedCategoriesIds.Add(2);
model.SelectedCategoriesIds.Add(3);

var newsToUpdate = new News {  Categories = new List<Category>() }; // Replace with your call to database

// Use an Entity Framework context to update our db model
using (var dbContext = new MyDbContext())
{
    // First clear existing categories
    newsToUpdate.Categories.Clear();

    // Now add selected categories
    foreach (var selectedCategory in model.SelectedCategoriesIds)
    {
        var dbCat = dbContext.Categories.Single(c => c.Id == selectedCategory);
        newsToUpdate.Categories.Add(dbCat);
    };

    // Save changes
    dbContext.SaveChanges();
}