我是Entity Framework Core的新手,我对下一种情况有疑问。
我有三个对象,像这样:
TableA {
public int Id {get; set;}
public string Name {get; set;}
public IList<TableA_TableB> TableA_TableBList {get; set;}
}
TableA_TableB {
public int Id {get; set;}
public TableA TableA {get; set;}
public int TableAId {get; set;}
public TableB TableB {get; set;}
public int TableBId {get; set;}
}
TableB {
public int Id {get; set;}
public string Name {get; set;}
public IList<TableA_TableB> TableA_TableBList {get; set;}
}
我正在使用Fluent Api来映射关系:
builder
.HasOne(a_b => a_b.TableA)
.WithMany(a => a.TableA_TableBList)
.HasForeignKey(a_b => a_b.TableAId);
builder
.HasOne(a_b => a_b.TableB)
.WithMany(b => b.TableA_TableBList)
.HasForeignKey(a_b => a_b.TableBId);
我的问题是,当我尝试在TableA中插入一个新值,并在TableA_TablesB中插入一个新值时,却存在一个存在的值TableB。我使用的代码是:
var entity = (TableA)tableADto; //From controller and convert to TableA using explict operator
entity.TableA_TableBList = new List<TableA_TableBList>();
entity.TableA_TableBList.Add(new TableA_TableB()
{
TableAId = entity.Id,
TableBId = 1 // I put a fix value just to test
});
_tableARepository.Add(entity);
_unitOfWork.Commit();
当我致电SaveChanges()
时,显示此错误:
INSERT语句与FOREIGN KEY约束“ FK_TableA_TableB_TableB_TableBId”相冲突。
在数据库“ tenantteste”的表“ dbo.TableB”的列“ Id”中发生了冲突。
我尝试获取TableB值并添加导航属性(TableB属性)。但是,不是创建关系,而是在保存时添加了值。
我已经阅读了文档以及关于stackoverflow的一些问题,我相信使用FK应该可以,但是没有用。
我不知道我在做什么错。
答案 0 :(得分:1)
有些错误。您的链接表不应具有代理密钥。这是文档中的“多对多”示例:
class MyContext : DbContext
{
public DbSet<Post> Posts { get; set; }
public DbSet<Tag> Tags { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<PostTag>()
.HasKey(t => new { t.PostId, t.TagId });
modelBuilder.Entity<PostTag>()
.HasOne(pt => pt.Post)
.WithMany(p => p.PostTags)
.HasForeignKey(pt => pt.PostId);
modelBuilder.Entity<PostTag>()
.HasOne(pt => pt.Tag)
.WithMany(t => t.PostTags)
.HasForeignKey(pt => pt.TagId);
}
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public List<PostTag> PostTags { get; set; }
}
public class Tag
{
public string TagId { get; set; }
public List<PostTag> PostTags { get; set; }
}
public class PostTag
{
public int PostId { get; set; }
public Post Post { get; set; }
public string TagId { get; set; }
public Tag Tag { get; set; }
}
https://docs.microsoft.com/en-us/ef/core/modeling/relationships#other-relationship-patterns
请注意,链接实体的复合键为(PostId,TabId)。