C# 实体框架中的多对多关系

C# 实体框架中的多对多关系,c#,entity-framework,linq,C#,Entity Framework,Linq,我有三张桌子 新闻 新闻类别 类别 当我创建一个新的News项目时,我需要为该新项目分配类别 我的代码是这样的 var NewsToSave = new News(); NewsToSave.NewsBody = model.NewsBody; NewsToSave.NewsTitle = model.NewsTitle; NewsToSave.NewsImagePath = NewsImagePath; NewsToSave.NewsDate = System.DateTime.Now;

我有三张桌子

  • 新闻
  • 新闻类别
  • 类别

当我创建一个新的
News
项目时,我需要为该新项目分配类别

我的代码是这样的

var NewsToSave = new News();
NewsToSave.NewsBody = model.NewsBody;
NewsToSave.NewsTitle = model.NewsTitle;
NewsToSave.NewsImagePath = NewsImagePath;
NewsToSave.NewsDate = System.DateTime.Now;

db.News.Add(NewsToSave);
db.SaveChanges();

foreach (var id in SelectedIDs)
{
    // How to assign selected categories to NewsToSave object and save the Ids in the middle table
}
如何将所选类别分配给
NewsToSave
对象


谢谢

您可以通过以下方式覆盖您的上下文:

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        modelBuilder.Entity<NewsToSave>()
            .HasMany(c => c.Categories).WithMany(i => i.NewsToSaves)
            .Map(t => t.MapLeftKey("NewsToSaveID")
                .MapRightKey("CategoryID")
                .ToTable("NewsCategory"));
    }

这在我几个月前制作的ASP.NET应用程序上非常有效。希望它能帮助您。

您可以通过以下方式覆盖您的上下文:

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        modelBuilder.Entity<NewsToSave>()
            .HasMany(c => c.Categories).WithMany(i => i.NewsToSaves)
            .Map(t => t.MapLeftKey("NewsToSaveID")
                .MapRightKey("CategoryID")
                .ToTable("NewsCategory"));
    }

这在我几个月前制作的ASP.NET应用程序上非常有效。希望它能帮助您。

您可以为每个id创建一个类别,附加它(前提是它已经存在于数据库中),然后将其添加到新闻的
类别列表中并保存:

foreach(var id in SelectedIDs)
{
    var category = new Category { CategoryId == id};
    db.Categories.Attach(category);
    NewsToSave.Add(category);
}

db.News.Add(NewsToSave);
db.SaveChanges();

您可以为每个id创建一个类别,附加它(前提是它已经存在于数据库中),然后将其添加到新闻的
类别列表中并保存:

foreach(var id in SelectedIDs)
{
    var category = new Category { CategoryId == id};
    db.Categories.Attach(category);
    NewsToSave.Add(category);
}

db.News.Add(NewsToSave);
db.SaveChanges();


在entity framwork中,您在导航属性中只能看到两个表。映射表将由EFM管理感谢您的帮助…您能帮助我解决我的问题吗?根据所选ID获取所有类别,然后执行
NewsToSave.categories=categories。假设您正确地完成了映射(多对多)EF将在实体框架中为您填充第三个表导航属性中只有两个表可供您访问映射表将由EF管理感谢您的帮助…您能帮我解决我的问题吗?根据所选ID获取所有类别,然后执行
NewsToSave.categories=categories。假设您正确地完成了映射(多对多)EF将为您填充第三个表他只想映射而不创建新类别他只想映射而不创建新类别他想将类别添加到新闻中您的解决方案来自另一边他不想that@BassamAlugili我想他需要两种方式来维持他的关系。Otherwish只需将
cat
查询替换为实际类别。他想将类别添加到新闻中,而你的答案来自另一方,他不想that@BassamAlugili我想他需要两种方式来维持他的关系。Otherwish只需将
cat
查询替换为实际类别。感谢您的帮助,但它不起作用。。它提供了错误附加信息:无法更新EntitySet“NewsCategory”,因为它有一个DefiningQuery,并且元素中不存在支持当前操作的元素。@Lucy您的DbContext中有DbSet新闻吗?@Lucy编写您的实体和DbContext这是非常基本的您需要的,如果您发布code@BassamAlugili可能需要编辑您的第一个LINQ查询
(**c**=>c.Id**=**=Id)
谢谢您的帮助,但它不起作用。。它提供了错误附加信息:无法更新EntitySet“NewsCategory”,因为它有一个DefiningQuery,并且元素中不存在支持当前操作的元素。@Lucy您的DbContext中有DbSet新闻吗?@Lucy编写您的实体和DbContext这是非常基本的您需要的,如果您发布code@BassamAlugili可能需要编辑您的第一个LINQ查询
(**c**=>c.Id**=**=Id)