类与 .下一个版本和 .上一页版本导航
本文关键字:版本 一页 导航 下一个 类与 | 更新日期: 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);