我有一张地点表,一份服务分配表和一份服务表。通过服务分配将位置和服务捆绑在一起。在位置创建我希望能够通过复选框为其分配服务。
但我无法访问位置创建视图中的服务。
位置模型
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;服务通过此表处理。
答案 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作为第一个项目来访问它们。