OR-mappers允许同一个表之间的一对多和一对一的关系?

时间:2009-11-07 16:11:56

标签: c# .net database orm

我正在寻找一个OR-mapper用于我即将开始的辅助项目。由于我们在工作中使用内部开发的OR映射器,我对其他映射器的工作方式并不是很了解(并且对于其中存在的情况非常不完整)。经过一些研究,似乎NHibernate,Linq-to-SQL和Entity Framework是最常用的。

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

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

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

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() {...}
}

我确定我在某处犯了一两个错误,但希望你能知道它是如何运作的。

答案 1 :(得分: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; }
}

答案 2 :(得分:0)

如果您有两个表,一个用于列表,另一个用于ListItems。 ListItems将具有列表的外键,列表将具有所选项的ListItem的外键。

这是一种非常简单的关系,应该在所有OR映射工具中得到支持。