类与 .下一个版本和 .上一页版本导航

本文关键字:版本 一页 导航 下一个 类与 | 更新日期: 2023-09-27 18:32:15

我有一个类,它有 2 个循环引用它的自身、.NextVersion.PreviousVersion ,它创建了一个对象的"链",如下所述。 尝试使用Add-Migration创建数据库时,出现以下错误:

无法确定 类型"SqlMetaQuery.Model.ScriptVersion"和 'SqlMetaQuery.Model.ScriptVersion'.这是主要目的 必须使用 关系流畅的 API 或数据注释。

public class ScriptVersion
{
    public Guid ScriptVersionId { get; set; }
    public Guid ScriptId { get; set; }
    public string Body { get; set; }
    public DateTime CreatedDate { get; set; }
    public User CreatedBy { get; set; }
    public ScriptVersion NextVersion { get; set; }
    public ScriptVersion PreviousVersion { get; set; }
}

我找到了类似问题的几个答案,这些问题的答案是使用.HasOptional.WithOptionalDependant来解决关联。这适用于其中一个导航属性,但当我尝试为第二个导航属性执行此操作时失败。

        modelBuilder.Entity<ScriptVersion>()
            .HasOptional(v => v.NextVersion)
            .WithOptionalDependent(v => v.PreviousVersion);
        modelBuilder.Entity<ScriptVersion>()
            .HasOptional(v => v.PreviousVersion)
            .WithOptionalDependent(v => v.NextVersion);

在类型上声明的导航属性"上一个版本" "SqlMetaQuery.Model.ScriptVersion"已配置 冲突的外键。

我做错了什么?

类与 .下一个版本和 .上一页版本导航

我不得不更改实体,但这是一个解决方案。诀窍是添加一个或多个额外的"假"属性来完成工作。

实体

public class ScriptVersion
{
    private ScriptVersion _nextVersion;
    private ScriptVersion _previousVersion;
    public Guid ScriptVersionId { get; set; }
    public Guid ScriptId { get; set; }
    public string Body { get; set; }
    public DateTime CreatedDate { get; set; }
    public User CreatedBy { get; set; }
    public ScriptVersion NextVersion
    {
        get { return _nextVersion; }
        set
        {
            _nextVersion = value;
            if (_nextVersion != null && _nextVersion.PreviousVersion != this)
            {
                _nextVersion.PreviousVersion = this;
            }
        }
    }
    public ScriptVersion PreviousVersion
    {
        get { return _previousVersion; }
        set
        {
            _previousVersion = value;
            if (_previousVersion != null && _previousVersion.NextVersion != this)
            {
                _previousVersion.NextVersion = this;
            }
        }
    }
    internal ScriptVersion InternalNextVersion
    {
        get { return NextVersion; }
    }
    internal ScriptVersion InternalPreviousVersion
    {
        get { return PreviousVersion; }
    }
}

modelBuilder.Entity<ScriptVersion>()
    .HasOptional(v => v.NextVersion)
    .WithOptionalDependent(x => x.InternalPreviousVersion);
modelBuilder.Entity<ScriptVersion>()
    .HasOptional(v => v.PreviousVersion)
    .WithOptionalDependent(x => x.InternalNextVersion);