EF核心:INSERT语句与FOREIGN KEY约束冲突

时间:2018-07-27 14:42:17

标签: c# entity-framework entity-framework-core

我是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应该可以,但是没有用。

我不知道我在做什么错。

1 个答案:

答案 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)。