【问题标题】:Repository insert with navigation property throws 'FOREIGN KEY constraint failed'带有导航属性的存储库插入抛出“外键约束失败”
【发布时间】:2020-05-27 17:38:29
【问题描述】:

我正在使用 EF Core 和 sqlite。给定以下一对一实体:

  public class Entity1:FullAuditedEntity<int>
  {
    public Entity2 Entity2 { get; set; }

    public string Name { get; set; }

  }

  public class Entity2: FullAuditedEntity<int>
  {

    public string Name { get; set; }       

    [ForeignKey("Entity1Id")]
    public Entity1 Entity1{ get; set; }
    public int Entity1Id { get; set; }
  }

以及以下插入逻辑:

    entity1.Entity2 = new Entity2();
    entity1= await entity1Repository.InsertAsync(entity1);//entity1Repository is of type IRepository<Entity1>

上面的代码抛出:

Microsoft.EntityFrameworkCore.DbUpdateException:更新条目时出错。有关详细信息,请参阅内部异常。 ---- Microsoft.Data.Sqlite.SqliteException:SQLite 错误 19:“外键约束失败”。 在...

这种方法也不起作用,抛出相同的:

    var entity2 = new Entity2();
    entity1.Entity2 = entity2;
    entity2.Entity1 = entity1;
    entity1= await entity1Repository.InsertAsync(entity1);//entity1Repository 

我做错了什么,我错过了什么?在设置 Entity2 属性的情况下创建 Entity1 和 Entity2 的正确方法是什么?是否可以仅使用 Entity1 repo 创建?

提前致谢。

更新:问题已解决。在实际代码中,entity2 对 entity3 有自己的引用,这显然是在抛出。这就是原因。

【问题讨论】:

  • 您插入了Entity2,但没有引用Entity1。您不应该对违反外键感到惊讶。
  • 我认为您的 ForeignKey 属性颠倒了。我认为它应该像[ForeignKey(nameof(Entity1))] public int Entity1Id { get; set; }一样进入int列(即Entity1Id)。
  • 另外,1-1 关系:您是否考虑过使用继承来映射它?喜欢 Entity2 : Entity1?
  • @GertArnold:感谢您的回复。以下代码,我也测试过,也有同样的异常: var entity2 = new Entity2();实体1.实体2 =实体2; entity2.Entity1 = entity1 ;
  • @LeeRichardson:感谢您的回复。根据这个参考(learnentityframeworkcore.com/configuration/…)我有案例2。至于继承——这两个类彼此无关。这只是为了简单的演示。我创建Entity1时需要默认创建Entity2

标签: entity-framework aspnetboilerplate asp.net-boilerplate


【解决方案1】:

像这样?

public class Entity1:FullAuditedEntity<int>
{
   public Entity2 Entity2 { get; set; } = new Entity2();

   public string Name { get; set; }    
}

var entity1 = new Entity1();
entity1 = await entity1Repository.InsertAsync(entity1);//entity1Repository

或者你想克隆?查看: https://entityframeworkcore.com/knowledge-base/48873716/how-to-deep-clone-copy-in-ef-core

【讨论】:

  • 感谢您的回复。不,不克隆。第一个你的方法是正确的,同样的事情。我按照你的建议做了,仍然是“外键”问题。也许它与存储库的类型(IRepository)有关?
【解决方案2】:

请参阅我的帖子中的更新——还有其他实体违反了 fk 约束。感谢大家的宝贵时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-24
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 2011-10-04
    • 2014-11-09
    相关资源
    最近更新 更多