ServiceStack OrmLite 多自引用错误
ServiceStack OrmLite Multi Self References bug
我正在尝试加载引用,但在这种情况下,使用来自同一 table 的两个引用无法正常工作
[Required]
public DateTime CreatedOn { get; set; }
public DateTime? ModifiedOn { get; set; }
[References(typeof(Employee))]
public int? CreatedById { get; set; }
[Reference]
public Employee CreatedBy { get; set; }
[References(typeof(Employee))]
public int? ModifiedById { get; set; }
[Reference]
public Employee ModifiedBy { get; set; }
正如你在上面看到的那样,我按照ORMLite的文档以正确的方式做到了:
https://github.com/ServiceStack/ServiceStack.OrmLite
即使属性 ModifiedById 和 CreatedById 具有值,它也不会加载属性:ModifieldBy 和 CreatedBy。我尝试使用必填字段并且它有效,但是当我尝试使用 int? nulable 它不起作用。
您可以在下图中看到,我在 ModifiedById 列中有一条值为“5”的记录,因此我的方法的 Loadreferences 应该得到列:ModifiedBy(加载了 Employee 对象)它在其他情况下有效例,而不是在这种情况下。
我添加了一个通过测试,该测试使用可为空的 int?
ID in this commit:
测试多个自引用
使用的类型:
public class ParentSelfRef
{
[AutoIncrement]
public int Id { get; set; }
[References(typeof(ChildSelfRef))]
public int? Child1Id { get; set; }
[Reference]
public ChildSelfRef Child1 { get; set; }
[References(typeof(ChildSelfRef))]
public int? Child2Id { get; set; }
[Reference]
public ChildSelfRef Child2 { get; set; }
}
public class ChildSelfRef
{
[AutoIncrement]
public int Id { get; set; }
public string Name { get; set; }
}
删除并重新创建表:
db.DropTable<ParentSelfRef>();
db.DropTable<ChildSelfRef>();
db.CreateTable<ChildSelfRef>();
db.CreateTable<ParentSelfRef>();
使用多个自引用创建记录:
var row = new ParentSelfRef
{
Child1 = new ChildSelfRef
{
Name = "Child 1"
},
Child2 = new ChildSelfRef
{
Name = "Child 2"
},
};
保存并测试填充的行:
db.Save(row, references: true);
row.PrintDump();
Assert.That(row.Id, Is.EqualTo(1));
Assert.That(row.Child1Id, Is.EqualTo(1));
Assert.That(row.Child1.Id, Is.EqualTo(1));
Assert.That(row.Child1.Name, Is.EqualTo("Child 1"));
Assert.That(row.Child2Id, Is.EqualTo(2));
Assert.That(row.Child2.Id, Is.EqualTo(2));
Assert.That(row.Child2.Name, Is.EqualTo("Child 2"));
使用自引用加载行:
row = db.LoadSingleById<ParentSelfRef>(row.Id);
Assert.That(row.Id, Is.EqualTo(1));
Assert.That(row.Child1Id, Is.EqualTo(1));
Assert.That(row.Child1.Id, Is.EqualTo(1));
Assert.That(row.Child1.Name, Is.EqualTo("Child 1"));
Assert.That(row.Child2Id, Is.EqualTo(2));
Assert.That(row.Child2.Id, Is.EqualTo(2));
Assert.That(row.Child2.Name, Is.EqualTo("Child 2"));
我正在尝试加载引用,但在这种情况下,使用来自同一 table 的两个引用无法正常工作
[Required]
public DateTime CreatedOn { get; set; }
public DateTime? ModifiedOn { get; set; }
[References(typeof(Employee))]
public int? CreatedById { get; set; }
[Reference]
public Employee CreatedBy { get; set; }
[References(typeof(Employee))]
public int? ModifiedById { get; set; }
[Reference]
public Employee ModifiedBy { get; set; }
正如你在上面看到的那样,我按照ORMLite的文档以正确的方式做到了: https://github.com/ServiceStack/ServiceStack.OrmLite
即使属性 ModifiedById 和 CreatedById 具有值,它也不会加载属性:ModifieldBy 和 CreatedBy。我尝试使用必填字段并且它有效,但是当我尝试使用 int? nulable 它不起作用。
您可以在下图中看到,我在 ModifiedById 列中有一条值为“5”的记录,因此我的方法的 Loadreferences 应该得到列:ModifiedBy(加载了 Employee 对象)它在其他情况下有效例,而不是在这种情况下。
我添加了一个通过测试,该测试使用可为空的 int?
ID in this commit:
使用的类型:
public class ParentSelfRef
{
[AutoIncrement]
public int Id { get; set; }
[References(typeof(ChildSelfRef))]
public int? Child1Id { get; set; }
[Reference]
public ChildSelfRef Child1 { get; set; }
[References(typeof(ChildSelfRef))]
public int? Child2Id { get; set; }
[Reference]
public ChildSelfRef Child2 { get; set; }
}
public class ChildSelfRef
{
[AutoIncrement]
public int Id { get; set; }
public string Name { get; set; }
}
删除并重新创建表:
db.DropTable<ParentSelfRef>();
db.DropTable<ChildSelfRef>();
db.CreateTable<ChildSelfRef>();
db.CreateTable<ParentSelfRef>();
使用多个自引用创建记录:
var row = new ParentSelfRef
{
Child1 = new ChildSelfRef
{
Name = "Child 1"
},
Child2 = new ChildSelfRef
{
Name = "Child 2"
},
};
保存并测试填充的行:
db.Save(row, references: true);
row.PrintDump();
Assert.That(row.Id, Is.EqualTo(1));
Assert.That(row.Child1Id, Is.EqualTo(1));
Assert.That(row.Child1.Id, Is.EqualTo(1));
Assert.That(row.Child1.Name, Is.EqualTo("Child 1"));
Assert.That(row.Child2Id, Is.EqualTo(2));
Assert.That(row.Child2.Id, Is.EqualTo(2));
Assert.That(row.Child2.Name, Is.EqualTo("Child 2"));
使用自引用加载行:
row = db.LoadSingleById<ParentSelfRef>(row.Id);
Assert.That(row.Id, Is.EqualTo(1));
Assert.That(row.Child1Id, Is.EqualTo(1));
Assert.That(row.Child1.Id, Is.EqualTo(1));
Assert.That(row.Child1.Name, Is.EqualTo("Child 1"));
Assert.That(row.Child2Id, Is.EqualTo(2));
Assert.That(row.Child2.Id, Is.EqualTo(2));
Assert.That(row.Child2.Name, Is.EqualTo("Child 2"));