是否可以使用ORMLite v4 for ServiceStack自动保存具有嵌套[Reference]属性的对象?例如:
public class Patient
{
[PrimaryKey]
public int Id { get; set; }
public string Name { get; set; }
[Reference]
public List<Insurance> Insurances { get; set; }
}
public class Insurance
{
[PrimaryKey]
public int Id { get; set; }
[ForeignKey(typeof(Patient))]
public int PatientId { get; set; }
public string InsuranceName { get; set; }
public string InsuranceLevel { get; set; }
[Reference]
public List<Contact> InsuranceContacts { get; set; }
}
public class Contact
{
[PrimaryKey]
public int Id { get; set; }
[ForeignKey(typeof(Insurance))]
public int InsuranceId { get; set; }
public string ContactName { get; set; }
}
我希望能够做到这一点......
var patient = new Patient
{
Name = "Nathan",
Insurances = new List<Insurance>
{
new Insurance
{
InsuranceName = "Aetna",
InsuranceLevel = "Primary",
InsuranceContacts = new List<Contact>
{
new Contact
{
ContactName = "Bob"
}
}
},
new Insurance
{
InsuranceName = "BCBS",
InsuranceLevel = "Secondary",
InsuranceContacts = new List<Contact>
{
new Contact
{
ContactName = "Susan"
}
}
}
}
}
db.Save(patient, references:true);
...让它写入所有三个表。就目前而言,我能想到的最好的事情是在保存顶级对象后添加它(“references:true”确实保存了第一个嵌套的引用级别 - 也就是说,保险表已正确填充):
foreach(Insurance insurance in patient.Insurances)
{
dbConn.SaveAllReferences(insurance);
}
这可以通过依赖于[Reference]表来存储和关联数据的深层嵌套JSON结构来解决。还有更好的方法吗?
谢谢!
答案 0 :(得分:3)
不支持在多嵌套结构上保存引用,但是您可能会试图将大型JSON分层文档转换为可能爆炸成多个表的关系结构。 / p>
摩擦力较小的解决方案是让OrmLite将嵌套的复杂类型保存为无模式文本blob,这应该考虑非聚合根数据,即附加到在外部没有意义的实体的元数据其父实体的上下文,并且不需要在服务器端查询。
OrmLite透明地支持blobbing复杂类型,基本上只需删除嵌套表上的[Reference]
属性。
否则,如果您想将它们保存在单独的表格中,您可以采用正确的方法,在遵循更具功能性的风格时可以将其浓缩为1-liner:例如:
patient.Insurances.Each(db.SaveAllReferences);