如何通过此关系访问其他模型

时间:2013-04-15 17:38:39

标签: asp.net-mvc-3 entity-framework razor

我有一张地点表,一份服务分配表和一份服务表。通过服务分配将位置和服务捆绑在一起。在位置创建我希望能够通过复选框为其分配服务。

但我无法访问位置创建视图中的服务。

位置模型

namespace LocApp.Models
{
    public class Location
    {
        public int id { get; set; }
        public string name { get; set; }
        public bool active { get; set; }

        public virtual ICollection<ServiceAssignment> ServiceAssignment { get; set; }
    }
}

服务模式

namespace LocApp.Models
{
    public class Service
    {
        public int id { get; set; }
        public string name { get; set; }
        public string description { get; set; }
        public bool active { get; set; }
        public string icon { get; set; }

        public virtual ICollection<ServiceAssignment> ServiceAssignment { get; set; }
    }
}

服务分配

namespace LocApp.Models
{
    public class ServiceAssignment
    {
        public int id { get; set; }
        public int locationID { get; set; }
        public int serviceID { get; set; }

        public virtual Location Location { get; set; }
        public virtual Service Service { get; set; }
    }
}

在我的上下文类中,我没有映射任何关系,根据我观察过的文章和屏幕演员,实体框架会为我找出那些东西。

所以这里的主要问题是:

我想在位置创建视图中访问service.name和id以创建复选框,这样当我保存新位置时,我可以在数据库中保存位置ID和服务ID。

这里的诀窍是地点和服务有多对多的关系。

service assignment id.
Location id -> service assignment location id 
service assignment service id <- service id

以上是服务分配表的基本布局。所有位置关系&lt; - &gt;服务通过此表处理。

2 个答案:

答案 0 :(得分:1)

如果您想要真正的多对多关联,则可以从模型中完全删除ServiceAssignment类。您的课程应如下所示:

public class Location
{
    public int id { get; set; }
    public string name { get; set; }
    public bool active { get; set; }

    public virtual ICollection<Service> Services { get; set; }
}

public class Service
{
    public int id { get; set; }
    public string name { get; set; }
    public string description { get; set; }
    public bool active { get; set; }
    public string icon { get; set; }

    public virtual ICollection<Location> Locations { get; set; }
}

EF将在数据库中创建一个联结表,并使用它来解析关联。您无法直接向此表添加记录,但是您可以通过Add()现有服务添加到Location.Services

修改

鉴于数据模型的限制,您可以做的是保持类模型不变并查询服务,如下所示:

db.Locations.Where(loc => loc.Id == locId)
    .SelectMany(loc => loc.ServiceAssignments)
    .Select(sa => sa.Service)

您可以通过创建ServiceAssignment并将其添加到Location.ServiceAssignments来添加服务。

它可能感觉不如直接的多对多关联,但根据我的经验,客户迟早会要求关于关联本身的更详细信息(例如,添加服务的日期)。当发生这种情况时,你会很高兴有明确的课程。

答案 1 :(得分:0)

我的想法是使用tuple<>,它允许我将多个模型传递给视图,然后通过model.item1.whatever item1作为第一个项目来访问它们。