ServiceStack ORMLite保存嵌套[参考]

时间:2014-05-10 03:41:24

标签: c# .net servicestack ormlite-servicestack

是否可以使用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结构来解决。还有更好的方法吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

不支持在多嵌套结构上保存引用,但是您可能会试图将大型JSON分层文档转换为可能爆炸成多个表的关系结构。 / p>

摩擦力较小的解决方案是让OrmLite将嵌套的复杂类型保存为无模式文本blob,这应该考虑非聚合根数据,即附加到在外部没有意义的实体的元数据其父实体的上下文,并且不需要在服务器端查询。

OrmLite透明地支持blobbing复杂类型,基本上只需删除嵌套表上的[Reference]属性。

否则,如果您想将它们保存在单独的表格中,您可以采用正确的方法,在遵循更具功能性的风格时可以将其浓缩为1-liner:例如:

patient.Insurances.Each(db.SaveAllReferences);