Entity framework ASP.NET MVC EF向链接表添加标记和

Entity framework ASP.NET MVC EF向链接表添加标记和,entity-framework,asp.net-mvc-3,asp.net-mvc-4,Entity Framework,Asp.net Mvc 3,Asp.net Mvc 4,我有一个包含所有数据的viewmodel。我需要将特定数据存储在正确的表中 我的桌子: [公司]身份证、姓名等 [标签]标识、标题 [公司标签](标签和公司之间的链接)Id、标签Id(FK)、公司Id(FK) 在控制器中,这是我拥有的: var companyAccount = new CompanyAccount { Name = viewModel.Name, }; foreach (var t in viewModel.Tags) {

我有一个包含所有数据的viewmodel。我需要将特定数据存储在正确的表中

我的桌子:

  • [公司]身份证、姓名等
  • [标签]标识、标题
  • [公司标签](标签和公司之间的链接)Id、标签Id(FK)、公司Id(FK)

  • 在控制器中,这是我拥有的:

     var companyAccount = new CompanyAccount
     {
         Name = viewModel.Name,            
     };
    
     foreach (var t in viewModel.Tags)
     {
          var tag = new Tags()
          {
              Title = t
          };                       
          context.Tags.Add(tag);
    
    它在下面的代码中失败。值为空,并执行异常:

    无法确定“Models.CompanyTags\u Tags”关系的主体端。多个添加的实体可能具有相同的主键

    是否需要将CompanyAccounted和TagsId添加到CompanyTags表中?或者EF可以在默认情况下添加它

          var companyTag = new CompanyTags()
          {
             CompanyAccountId = companyAccount.Id,
             TagsId = tag.Id
          };
          context.CompanyTags.Add(companyTag);
    
      }
       context.CompanyAccount.Add(companyAccount);
       context.SaveChanges();
    

    我认为我的逻辑不正确,我如何修复它?

    在大多数情况下,您不需要定义关系实体。您将有三个表,但只有两个实体。该关系通过导航属性和Fluent API配置进行处理

    导航属性标签和公司

    public class Company
    {
        public Company()
        {
            this.Tags = new List<Tags>();
        }
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual ICollection<Tags> Tags { get; set; }
    }
    
    public class Tags
    {
        public Tags()
        {
            this.Companies = new List<Company>();
        }
        public int Id { get; set; }
        public string Title { get; set; }
        public virtual ICollection<Company> Companies { get; set; }
    }
    

    这将创建一个新公司、新标签和关系行。

    您如何配置EF?您是否先使用数据库,先使用代码?@Jasen先使用代码除非您需要公司标记关系上的其他字段,否则您不需要显式定义CompanyTags实体。因此,如果我删除添加公司标记的代码。那么如何将CompanyAccounted和TagsId添加到CompanyTags表中?如果你能提供一个例子,谢谢Jasen的例子。我对现有的标签代码感到困惑。如何获取tagid?在循环中,我将标记添加到表context.Tags.add(tag)中,并且仅在SaveChanges()上存储它,那么这是如何工作的呢?var tag=context.Tags.Single(t=>t.Id==tagId);company.Tags.Add(标签);请详细说明它是如何工作的以及我是如何获得tagid的?我还注意到你没有使用“虚拟”关键字,为什么?谢谢我忘了加虚拟的。对于tagId,这只是一个你知道Id的例子。我把这个例子改为使用标签标题。我还是不明白。由于尚未执行savechanges(),并且标记表尚未存储数据,如何将标题与标记tbl标题进行比较。很抱歉,我迷路了。您是否能够更新代码,向我展示如何在我拥有的foreach循环中添加标记和公司标记。谢谢你的帮助!请参见编辑。有不止一种方法可以做到这一点。您可以先保存标记和公司,然后设置与现有行的关系。或者尝试一次创建所有内容。谢谢Jasen的帮助。
    public class Company
    {
        public Company()
        {
            this.Tags = new List<Tags>();
        }
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual ICollection<Tags> Tags { get; set; }
    }
    
    public class Tags
    {
        public Tags()
        {
            this.Companies = new List<Company>();
        }
        public int Id { get; set; }
        public string Title { get; set; }
        public virtual ICollection<Company> Companies { get; set; }
    }
    
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Company>()
            .HasMany(c => c.Tags)
            .WithMany(t => t.Companies)
            .Map(m =>
            {
                m.MapLeftKey("Companyd");
                m.MapRightKey("AgentId");
                m.ToTable("CompanyTags");
            }
    }
    
    // new Company
    var company = new Company() { Name = "FooBar Inc" };
    
    // new Tags
    // for loop if you wish
    company.Add(new Tag { Title = "tag1" });
    company.Add(new Tag { Title = "tag2" });
    
    context.Companies.Add(company);
    context.SaveChanges();