【问题标题】:What OR-mappers allow one-to-many AND One-to-one relationship between the same tables?哪些 OR-mappers 允许相同表之间的一对多和一对一关系?
【发布时间】:2010-12-14 04:36:20
【问题描述】:

我目前正在寻找一个 OR-mapper 用于我即将开始的一个副项目。由于我们在工作中使用的是内部开发的 OR-mapper,所以我不太了解其他映射器的工作原理(并且对存在的映射器有相当不完整的了解)。经过一些研究,NHibernate、Linq-to-SQL 和 Entity Framework 似乎是最常用的。

所以这是我的问题:是否可以在 [在此处插入您最喜欢的 ORM] 中映射相同表之间的一对多和一对一关系以及它是如何完成的(优雅) ? 一个简单的例子是存储项目列表(一对多)和选定项目(一对一)。

我选择这个特定问题的原因是它是我们内部 OR-mapper 的一个痛点:它只是不允许两个表之间存在多个关系。我想从与这些映射器一起工作的人那里获得一些见解,以帮助我决定将哪个(现有的!)OR-mapper 用于我的副项目。

感谢您的帮助!

【问题讨论】:

    标签: c# .net database orm


    【解决方案1】:

    我认为大多数领先的 ORM 都支持这种映射(我听到的唯一例外是Subsonic)。例如在DataObjects.Net 中,它看起来像这样:

    public class ItemStore : Entity
    {
      [Field, Key]
      public int Id { get; set; }
    
      [Field]
      public Item SelectedItem { get; set; }
    
      [Field, Association(PairTo = "Store")]
      public EntitySet<Item> Items { get; private set; }
    }
    
    public class Item : Entity
    {
      [Field, Key]
      public int Id { get; set; }
    
      [Field]
      public ItemStore Store { get; set; }
    }
    

    【讨论】:

    • 感谢您的回答!但是我只能看到一对多的映射,似乎缺少所选项目的映射(一对一)。还是我忽略了什么?
    • 好的,我已经更新了我的模型。看来我没有清楚地理解你的例子。
    • 你知道为什么 Subsonic 不允许这种类型的关系吗?
    • 我对亚音速不太熟悉,最好问问使用它的人或在他们的网站上查找详细信息。刚刚听说根本不支持引用字段,即不能声明Item类型的字段SelectedItem,只能声明SelectedItemId。
    【解决方案2】:

    OR 映射器的目的是使数据库对应于一个对象图。因此,您描述的关联可能如下所示:(这里我使用的是 Hibernate,它或多或少与 NHibernate 相同,但使用的是 Java 而不是 C#/.NET)

    //table schema: 
    // item_store(item_store_id, selected_item_id)
    
    @Entity
    @Table(name="item_store")
    class ItemStore {
     @Id
     @Column(name="item_store_id")
     public String getId() {...}
    
     @OneToMany(mappedBy="itemStore")
     public Collection<Item> getItems() {...}
    
     @ManyToOne
     @JoinColumn(name="selected_item_id")
     public Item getSelectedItem() {...}
    }
    
    //table schema:
    // item(item_id, item_store_id)
    
    @Entity
    @Table(name="item")
    class Item {
     @Id
     @Column(name="item_id")
     public String getId() {...}
    
     @ManyToOne
     @JoinColumn(name="item_store_id")
     public ItemStore getItemStore() {...}
    }
    

    我确定我在这里的某个地方犯了一两个错误,但希望你明白它是如何工作的。

    【讨论】:

    • “@”符号是 Java 注释元数据。 NHibernate 等价物是使用带有 NHibernate.Mapping.Attributes 插件的属性:hibernate.org/hib_docs/nhibernate/1.2/reference/en/html_single/…(默认方法使用 XML 映射文件;我更喜欢注解,因为它们更易于阅读、编译器检查和更接近他们操作的代码)
    • 是的,我知道注释——在大学里做过一些 Java(不过几年前)。感谢您的链接!我(强烈)同意您的观点,即使用属性比使用(单独的)XML 映射要好得多。
    • NHibernate 看起来很不错!几周前我玩过它,不得不承认我非常喜欢它(尤其是在使用 FluentNHibernate 时)。
    【解决方案3】:

    如果您有两张表,一张用于 Lists,一张用于 ListItems。 ListItems 将具有 Lists 的外键,Lists 将具有 ListItems 所选项目的外键。

    这是一个非常简单的关系,所有 OR-mapping 工具都应该支持。

    【讨论】:

    • 我知道如何将它映射到数据库表。我只对它如何在不同的 OR-Mappers 中完成感兴趣。抱歉,我应该在我的问题中更清楚地说明这一点(现在突出显示该部分)。不过还是谢谢你的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 2022-01-05
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    相关资源
    最近更新 更多