【发布时间】:2014-03-20 09:34:48
【问题描述】:
多态模型的概念。例如我们有这个表注释:
+----+---------------+-------------------+------------------------------------+
| id | commentable_id| commentable_type | comments_text |
+----+---------------+-------------------+------------------------------------+
| 1 | 2 | youtube | youtube rocks, buddy! |
| 2 | 6 | vimeo | hey, vimeo is better! |
+--------------------+-------------------+------------------------------------+
- 其中 youtube 和 vimeo 指的是模型
class Youtube(){…}和class Vimeo(){…}youtube can 有很多 cmets,vimeo can 有很多 cmets,comment 属于 youtube 和 vimeo。 - 如果我们以后想添加另一个具有许多 cmets 的模型,我们只需将其添加到
commentable_type中,而无需在评论表中添加更多字段,例如something_id。 - 如果我们想添加dailymotion,我们只需要在
commentable_type中添加dailymotion,而不需要在评论表中添加字段dailymotion_id -
commentable_id = 2指的是 youtube 表中的youtube_id = 2,commentable_id= 6 指的是vimeo_id= 6 中的 vimeo 表。
在 Laravel (PHP) 中,我们可以简单地这样做:
class Youtube extends Eloquent{
public function comments()
{
return $this->morphMany('Comment', 'commentable');
}
}
class Vimeo extends Eloquent{
public function comments()
{
return $this->morphMany('Comment', 'commentable');
}
}
class Comment extends Eloquent{
public function commentable()
{
return $this->morphTo();
}
}
我们可以像这样简单地访问它们:
$youtube = Youtube::find(1);
$youtube->comments;
$vimeo = Vimeo::find(1);
$vimo->comments;
我的问题是,如何在 ASP MVC 中推导出这个 ORM 的关系?以及我们如何才能轻松访问它们进行 CRUD 操作?
【问题讨论】:
-
这是一个 ORM 问题,而不是 ASP.NET 问题。您使用的是哪个 ORM,因为每个 ORM 将有不同的方法来解决这个问题?
-
@BiffBaffBoff 也许我关于 ORM 的问题是错误的。如何在 ASP MVC 中做到这一点?如何在 ASP MVC 中定义这种关系?这样我们就可以轻松访问那些 cmets
-
你目前有什么代码?我不知道您使用什么 ORM 来访问您的模型,所以我无法告诉您如何访问它..
-
@BiffBaffBoff 我先使用 EF 代码
标签: c# asp.net sql asp.net-mvc polymorphism