我有包含所有数据的viewmodel。我需要在右表中存储特定数据。
我的表格:
[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; }
}
在控制器中,这就是我所拥有的:
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();
我认为我的逻辑不正确,我该如何解决?
答案 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();
这应该创建一个新公司,新标签和关系行。