使用实体框架(使用 MVC,但我认为这无关紧要),我正在尝试制作一个......可扩展的实体。
我有许多类,用户可以将它们标记为收藏夹或书签……实际上有几个不同的对象使用了这个功能。我目前在我的模型中实现这个的方式是这样的(例如):
public class Favorite
{
[key]
public int FavoriteId {get; set;}
public int? BikeId {get; set;}
public virtual Bike Bike {get;set;}
public int? HelmetId {get;set;}
public virtual Helmet Helmet {get;set;}
public int? ShoeId {get;set;}
public virtual Shoe Shoe{get;set;}
public int UserId {get;set;}
public virtual User User {get;set;}
}
自行车、头盔、用户和鞋子类都类似于:
public class Bike
{
public int BikeId {get;set;}
...
public virtual list<Favorties> Favorites {get;set;}
}
所以目前我的桌子看起来像这样:
Favorites:
| Id | BikeId | HelmetId | ShoeId | UserId |
| 1 | 5 | | | snowburnt |
| 2 | 6 | | | jonh |
| 3 | | 2 | | snowburnt |
我更喜欢最喜欢的对象的结构,其中有一个区分列存储被引用的对象的名称作为多列主键的一部分,以便收藏夹表看起来更像这样(我知道用户 ID 不是一个整数):
Favorites:
| ID | Differentiator | foreignKeyId | UserId |
| 1 | Bike | 5 | snowburnt |
| 2 | Bike | 6 | john |
| 3 | Helmet | 2 | snowburnt |
想要这样做的主要原因是,如果我有新的对象想要集成到收藏夹中,我就不必修改收藏夹对象的结构。
层次结构应该类似于:
自行车、头盔等有 0 到多个收藏夹
这在 asp.net 实体框架中可能吗?我怎样才能做到这一点?有什么好的参考资料可以深入实体框架吗?
注意:我在这里看到了这些帖子,http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part -1-table-per-hierarchy-tph.aspx这会很好用......如果我在这里有继承情况(我不能有继承情况的大部分原因是我有多个类或接口需要相同的关系:收藏夹、书签、评论、评论等)。很可能我可以/应该使用收藏夹的界面(制作自行车、头盔收藏夹)。我还没有找到任何关于这将如何最终映射到 SQL Schema 中的注释(那时甚至会有一个收藏夹表吗?)