【问题标题】:Mapping model to other model using multiple columns使用多列将模型映射到其他模型
【发布时间】:2012-03-19 08:23:45
【问题描述】:

我有两个模型:

public class Destinations
{
    public int DestinationsID { get; set; }
    public virtual Navigation Navigation { get; set; }
}

public class Navigation
{
    public int NavigationID { get; set; }
    public string ParameterName { get; set; }
    public int ParameterValue { get; set; }
    public string FriendlyURL { get; set; }
}

两者都有更多内容,但这些是重要的部分。当我保存目的地时,我将 Navigation ParameterName 设置为“Destination”,并将 ParameterValue 设置为 DestinationID。

我无法将目的地映射到导航,因为导航根本不依赖于目的地。它可以将任何模型作为 ParameterName 并将 ParameterValue 作为该模型的 ID(或者这两者甚至可以为 null,因为它仅与页面相关而不与任何其他模型相关)。

因此,当我查看单个目的地或循环浏览列表时,我需要能够获取 Navigation.FriendlyURL。这就是为什么我添加了 public virtual Navigation Navigation { get;放; }。在我的映射类中,虽然我需要能够根据“Destination”的 ParameterName 和 Destinations.DestinationID 的 ParameterValue 获取导航。这就是我完全陷入困境的地方。

我假设我需要这样的东西:

        this.HasRequired(d => d.Navigation)
            .WithRequiredDependent(WHAT GOES HERE)
            .Map(WHAT GOES HERE)
            .WillCascadeOnDelete(false);

【问题讨论】:

    标签: asp.net-mvc entity-framework ef-code-first


    【解决方案1】:

    如果您想在Destinations 中映射Navigation 属性,可以尝试这样的操作

        this.HasRequired(d => d.Navigation)
            .WithMany()
            .WillCascadeOnDelete(false);
    

    编辑 您无法映射此关系,但您可以构建查询以通过手动关系修复来检索两者。

    var query = (from d in db.Destinations
            join n in db.Navigations on d.DestinationsID equals n.ParameterValue
                    where n.ParameterName == "Destination" 
            select new { d, n }).ToList();
    
    // Display joined groups.
    foreach (var group in query)
    {
        group.d.Navigation = group.n;
    }
    

    【讨论】:

    • 关系是一对一的。它也没有这样的外键,而是通过导航中的 ParameterName(在本例中始终为“Destination”)和 ParameterValue(Destination 的主键)字段进行映射。
    • @DreadPeter 在这种情况下,无法进行映射。一对一使用共享PK。
    • 好的,所以我有这样的代码: List destinations = db.Destinations.Where(d => d.Active == true && d.DestinationTypeValue == dd.DestinationTypeValue).ToList ();是否可以在其上添加一个“包含”以添加适当的导航项,然后我可以通过视图中的模型进行访问。即使我必须创建一个 ViewModel(我可能还需要帮助)。
    • 显然这不起作用,但类似这样: List destinations = db.Destinations.Include(db.Navigation.Where(n => n.ParameterName == "Destination" && n .ParameterValue == d.DestinationID)).Where(d => d.Active == true && d.DestinationTypeValue == dd.DestinationTypeValue).ToList();
    • @DreadPeter 你可以建立一个查询来做到这一点。我已经编辑了我的答案来说明这一点。
    猜你喜欢
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    相关资源
    最近更新 更多