PetaPoco(DotNetNuke)和SQL - 使用List属性或其他复合对象添加对象

时间:2013-02-03 23:49:04

标签: c# sql json dotnetnuke petapoco

我正在使用基于PetaPoco的数据访问层(DotNetNuke 7.0)。我在使用相对简单的对象时已成功使用它,但我现在必须插入一个包含至少一个属性的对象,该属性是其他对象的列表。

例如:

class Person
{
   public Person(){}
   public string name { get; set; }
   public List<Address> addresses { get; set; }
}
class Address
{
   ...
}

我正在使用的实际对象比上面的示例复杂得多 - 对象中至少有四个复合List对象要插入到存储库中。

我希望能够做的是在SQL中定义表并能够像这样简单地调用PetaPoco:

public static void AddOrder(Person person)
{
    using (IDataContext context = DataContext.Instance())
    {
        var repository = context.GetRepository<Person>();
        repository.Insert(person);
    }
}

此背景是该对象从Knockout / jQuery前端传递到Web服务,因此JSON字符串将转换为数据对象,然后必须将其存储在数据库中。

我认为实际上有三个问题:

  1. 如何编写代表Person和包含的地址列表的SQL表?

  2. 如何编写必要的PetaPoco代码以将Person对象与其包含的任何对象一起插入?

  3. 我是否应该忘记尝试将对象存储在数据库上,而只是将JSON字符串存储在数据库中?

  4. 感谢您寻找:)

1 个答案:

答案 0 :(得分:1)

我还没有安装DotNetNuke 7,但我检查了codeplex的源代码,我认为你可以这样做:

public static void AddOrder(Person person)
{
    using (IDataContext context = DataContext.Instance())
    {
        var repositoryPerson = context.GetRepository<Person>();
        var repositoryAddrress = context.GetRepository<Address>();

        context.BeginTransaction();
        try 
        {
            repositoryPerson.Insert(person);
            foreach(var address in person.addresses)
            {
                repositoryAddress.Insert(address);
            }
            context.Commit();
        }
        catch (Exception) 
        {
           context.RollbackTransaction();
           throw;
        }
    }
}

我没有测试过,所以我不能保证它有效,但这似乎对我来说。