ASP.NET MVC EF添加标签和链接表

时间:2014-09-17 17:53:18

标签: entity-framework asp.net-mvc-3 asp.net-mvc-4

我有包含所有数据的viewmodel。我需要在右表中存储特定数据。

我的表格:

  1. [公司]身份证,姓名......等
  2. [Tags] Id,Title
  3. [CompanyTags](标签和公司之间的链接)ID,TagId(FK),CompanyId(FK)

    public class CompanyTags
    {
       public int Id { get; set; }
       public int CompanyAccountId { get; set; }
       public virtual CompanyAccount CompanyAccount { get; set; }        
       public int TagsId { get; set; }
       public virtual Tags Tags { get; set; }
    }
    
  4. 在控制器中,这就是我所拥有的:

     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_Tags'关系的主要结尾。多个添加的实体可以具有相同的主键。

    我是否需要将CompanyAccountId和TagsId添加到CompanyTags表中?或者不知何故EF可以默认添加它?

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

    我认为我的逻辑不正确,我该如何解决?

1 个答案:

答案 0 :(得分:0)

在大多数情况下,您不需要定义关系实体。您将拥有三个表但只有两个实体。该关系由导航属性和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; }
}

DbContext中使用Fluent API配置的多对多关系

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

这应该创建一个新公司,新标签和关系行。