【问题标题】:Subsonic - can anyone provide an example of using Subsonic SimpleRepository to persist a list/array of objects?Subsonic - 任何人都可以提供使用 Subsonic SimpleRepository 来持久化对象列表/数组的示例吗?
【发布时间】:2009-10-22 22:29:14
【问题描述】:

我正在寻找可能的方法来持久化以下类。亚音速 SimpleRepository 看起来可能有效,当我询问 more general question 时,人们说它应该有效。

但我一直找不到一个如何做到这一点的例子——或者至少一个我能理解的例子。

谁能给我举个例子,或者告诉我如何使用 Subsonic 将以下类映射到数据库?

请注意,我还没有设计数据库 - 我希望 Subsonic 会为我做这件事,我是懒惰的草皮......

编辑: 只是为了扩展上一点 - 我希望 Subsonic 将我的对象模型转换为关系数据库,处理所有父子关系和一对多关系这是暗示的。目前,我认为 Subsonic 无法做到这一点。但即使是在对象模型中显式管理外键等的工作示例(不是代码片段)也会很有用。

我想坚持的课程的一些背景和笔记:

  • 它们被控制某些测量设备的软件使用
  • Data 类包含一个 RunData 对象数组,称为 RunFn,最多保存数据 10 个单独的测量运行
  • 请注意,RunData 还包含一个数组 浮点数 - RawY
  • 如有必要,我们可以将数组更改为其他类型的集合(List 等)
  • 使用 C#、VS2008 为 SQL Server Express 开发

编辑:我使用的是 Subsonic 3.0.0.3。

public class RunData

{
    public DateTime StartDateTime { get; set; }
    public TimeSpan ElapsedTime { get; set; }

    private float[] _rawY;
    public float[] RawY
    {
        get
        {
            return _rawY;
        }
        set
        {
            _rawY = value;
        }
     }
 }

public Data
{
    public string OperatorId { get; set; }
    public string SampleId { get; set; }

    // CAN SUBSONIC DEAL WITH THIS ARRAY OF OBJECTS???
    private RunData[] _runFn;
    public RunData[] RunFn
    {
        get
        {
            return _runFn;
        }
        set
        {
            _runFn = value;
        }
    }
}

【问题讨论】:

    标签: subsonic subsonic3 parent-child one-to-many simplerepository


    【解决方案1】:

    我不确定我是否会回答您在这里提出的所有问题,但如果我使用 SimpleRepository 实现这一点,我将拥有以下模型:

    public class RawYValue
    {
      public int Id { get; set; }
      public int RunDatumId { get; set; }
      public float YValue { get; set; }
    }
    
    public class RunDatum
    {
       var repo = new SimpleRepository();
    
       public int Id { get; set; }
       public int DataId { get; set; }
       public DateTime StartDateTime { get; set; }
       public TimeSpan ElapsedTime { get; set; }
    
       public IQueryable<RawYValue> RawYValues 
       { 
         get { return repo.Find<RawYValue>(rawYValue => rawYValue.RunDatumId == Id); }
       }
     }
    
    public Data
    {       
      var repo = new SimpleRepository();
    
      public int Id { get; set; }
      public string OperatorId { get; set; }
      public string SampleId { get; set; }
    
      // CAN SUBSONIC DEAL WITH THIS ARRAY OF OBJECTS???
      public IQueryable<RunDatum> RunData 
      { 
         get { return repo.Find<RunDatum>(runDatum => runDatum.DataId == Id); }
      }
    }
    

    我想 SubSonic 将无法将某些名称复数化,因此您可能需要更改它们,但希望这可以帮助您入门。

    【讨论】:

    • +1 - 谢谢亚当 - 正是我想要的。我会在第二天左右尝试,如果一切正常,将您的答案标记为已接受。
    • 我试过了,Subsonic 为 Data 类创建了一个表,但它只是忽略了 RunData 列表。然后我将 Data 类修改为具有单个 RunDatum 属性,但这也不起作用。到目前为止唯一有效的是执行“repository.Add(RunDatum)”,它创建了另一个表,与第一个表没有关系。我希望 Subsonic 能够浏览整个班级层次结构,并以此构建数据库模式。
    • 顺便说一句,复数形式似乎适用于我原来的名字。另外,我使用的是 Subsonic 3.0.0.3,如果这有什么不同的话。
    • 您需要通过创建 SimpleRepository 实例并将 SimpleRepositoryOptions.RunMigrations 传递给构造函数来告诉 SubSonic 运行迁移。你看过文档吗? subsonicproject.com/docs/Using_SimpleRepository
    • 是的,这样做。从那以后,我发现了一些 SO 问题(包括您的一些问题),这些问题说当前版本的 Subsonic 无法自动生成模式,但 Rob 正在研究它,例如stackoverflow.com/questions/1114691/… 。他们中的大多数在标题中都有“一对多”、“父子”等。
    【解决方案2】:

    回答我自己的问题...

    尽管我发现其他一些帖子暗示 Subsonic SimpleRepository 可以从对象模型自动生成关系模式,事实证明并非如此。请参阅 Rob Conery 对此问题的回答:

    relationships-and-lazy-loading-in-subsonic-3-0

    不过,他正在努力,可能值得等待。

    与此同时,我查看了 Fluent NHibernate,它可以立即满足我的需求。他们的源代码下载有一个名为 Examples.FirstProject 的演示项目,它演示了我正在寻找的功能。他们的文档似乎也更加成熟。

    不过,NHibernate 总体上也显得更加复杂,所以看看 Subsonic 的发展会很有趣。

    编辑:这是一个有用的链接,展示了如何在 SimpleRepository 中自己管理外键 -

    subsonic-3-simplerepository

    我自己没试过,但看起来确实可以。

    【讨论】:

    • SubSonic 将使用 SimpleRepository 为您生成数据库模型,但您需要迁移每个表。这个问题说的是深度储蓄。
    • @Adam - 我认为更正确的说法是“SimpleRepository 会自动为您创建和迁移单个表,但您需要自己管理对象中的关系模型”。如果我错了,请发布一个完整的工作示例,有人可以将其粘贴到 Visual Studio 中并有合理的机会使其正常工作。
    • @Tom - 我很想知道 Fluent NHibernate 在这种情况下如何为您解决问题?我面临与 SimpleRespository 完全相同的问题,所以我认为它值得一看。
    • @Alex - 我在 Fluent NHibernate 方面取得了一些成功 - 搜索“Automapping”标签以了解我的一些经验。自动映射功能主要工作,从对象模型创建一个关系数据库。非常灵活和强大。不利的一面是,它比 Subsonic 复杂得多,并且文档和工作示例很少。但我得到了原作者的帮助,并继续在我的项目中使用它。据我所知,如果您想要对相当复杂的对象进行真正的自动映射,那么它是唯一的游戏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多