【问题标题】:How can I get access to a differnt model with this relationship如何通过这种关系访问不同的模型
【发布时间】:2013-04-07 22:23:40
【问题描述】:

我有一张位置表、一张服务分配表和一张服务表。位置和服务通过服务分配联系在一起。在位置创建中,我希望能够通过复选框为其分配服务。

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

位置模型

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

以上是服务分配表的基本布局。位置服务的所有关系都是通过这个表来处理的。

【问题讨论】:

  • 我猜ServiceAssignment.ServiceAssignment 的属性是错字?还是原因?
  • 你能说得更具体些吗?我看过的每个教程都会做类似public virtual Book Book { get; set; }
  • 应该是public virtual Service Service { get; set; },因为它是ServiceAssignmentLocation之间的连接点。
  • 是的,我改变了它,我现在正在测试它是否有效,并且在测试时我仍然无法访问,当我这样做时:@Html.CheckBoxFor(model =&gt; model. 我可以访问 ServiceAssignment 而没有其他...

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


【解决方案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()-ing 现有 服务到 Location.Services 来做到这一点。

编辑

鉴于数据模型的约束,您可以做的就是让类模型保持原样并像这样查询服务:

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

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

它可能感觉不如直接多对多关联优雅,但根据我的经验,客户迟早会需要有关关联本身的更详细信息(例如,添加服务的日期)。发生这种情况时,您会很高兴有可用的显式类。

【讨论】:

  • 尽管我很想这样做 Gert,但我做不到。我得到了这些表格,因为它们反映了客户通过使用交汇点在位置和服务之间的关系方面所拥有的东西——就像我在 OP 中一样。您能否更新您的答案以显示在创建位置时如何获取某个位置的所有服务以及如何将其保存到数据库中?
【解决方案2】:

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

【讨论】:

  • 关于视图部分。你可以这样做,但Tuple 是一个不起眼的野兽。不适合不言自明的服务边界。我会使用视图模型,例如 LocationViewModel 有一个 'ServiceViewModel`s 的集合,代表 所有 服务,每个服务都有一个布尔值,无论它们是否被选择用于该位置。
猜你喜欢
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 2021-06-03
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多