Entity framework ASP.NET MVC EF向链接表添加标记和
我有一个包含所有数据的viewmodel。我需要将特定数据存储在正确的表中 我的桌子: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) {
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();