【问题标题】:Unable to determine a valid ordering for dependent operations with assigning self as parent无法确定将 self 指定为父级的依赖操作的有效排序
【发布时间】:2017-08-18 18:49:36
【问题描述】:

当我尝试将自己指定为插入的父级时,出现以下错误。

无法确定相关操作的有效顺序。由于外键约束、模型要求或存储生成的值,可能存在依赖关系。

代码如下。我以为我可以做到这一点,但我想不会。如何在插入时执行此操作?

public class Team {

    public int? TeamParentId { get; set; }

    [ForeignKey("TeamParentId")]
    public virtual Team TeamParent { get; set; }

    public virtual ICollection<Team> Teams { get; set; }
}

发生错误的地方

    divisionTeam.Team.TeamParent = divisionTeam.Team;

 if (divisionTeam.Id == 0)
            {
                _divisionTeamsRepository.Add(divisionTeam);
            }

            UnitOfWork.Commit();

DataContext.cs

modelBuilder.Entity<Team>()
    .HasOptional(p => p.TeamParent)
    .WithMany(p => p.Teams)
    .HasForeignKey(q => q.TeamParentId);

我怎样才能做到这一点?

【问题讨论】:

  • 这里的实际问题是什么:为什么会出现此错误?或如何使用 EF 将实体设置为自己的父级?
  • 我在文章的最后说明了我如何完成它。

标签: c# .net entity-framework ef-code-first


【解决方案1】:

似乎您设置团队的方式正在创建一个循环,EF“不可能”“保存”。

如果您询问您如何实际完成此操作,那么您必须实际保存没有父级的 Team,并在 SaveChanges() 方法之后将其 Id 分配给 TeamParentId,如下所示:

var team = new Team(....);

db.Teams.Add(team);

team.TeamParentId = team.Id;

db.SaveChanges();

我知道这看起来很复杂,但这是我能想到的唯一方法。希望对你有帮助

【讨论】:

【解决方案2】:

1) 转到 *.tt POCO 生成器文件

2) 查找文本“ForeignKeyFilter”

3) 设置

ForeignKeyFilter = (ForeignKey fk) =>
{
    if (fk.FkTableName == fk.PkTableName)
       return null;
    return fk;
};

引用的记录和集合不会生成结果类型(那么它不能在代码中使用)。外键项目仍然存在。 INSERT 就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2023-04-04
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    相关资源
    最近更新 更多