【问题标题】:Am I building the wrong entities in MVC?我在 MVC 中构建了错误的实体吗?
【发布时间】:2014-05-29 15:49:57
【问题描述】:

目标。我有一个“礼物”实体,它描述了某人必须提供的东西(保姆、遛狗等)并带有评级。我想要一个“GiftCategory”实体,它提供一般类别描述信息(宠物、运动、汽车等),供某人搜索 apon,然后获取所有具有这些类别的礼物。一个“Gift”实体可以有多个与之关联的“GiftCategory”实体。我希望能够搜索一个类别并提取所有与这些类别相关联的类别创建的“礼物”实体。这是我到目前为止所拥有的,但它似乎不适用于实体优先方法。也许我需要另一个表来连接这两个实体,因为目前这两个表的连接方式似乎不正确?

礼物实体:

public class Gift
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<GiftCategory> Categories { get; set; } // is this incorrect???
    public int Rating { get; set; }
}

类别实体:

public class GiftCategory
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

创建的“GiftCategory”表创建了一个gift_id 列,该列将“GiftCategory”链接回一个礼物(不是我想要的)!!!!

似乎我需要创建一个连接两个实体的实体?比如:

public class ConnectGifts
{
    public int Id { get; set; }
    public string GiftId{ get; set; }
    public string GiftCategoryID{ get; set; }
}

这样我可以有多个类别的礼物,但我不明白的是实体首先我真的不需要这个实体我只需要这个表来获取/查询“GiftCategory” id 的实体然后获取礼物 ID 以获取所有礼物。所以似乎创建这个实体是矫枉过正的?有没有办法在不首先使用代码创建第三个表/实体(“ConnectGifts”)的情况下做到这一点?还是我不明白所有实体都是表,所有表都是实体?我还在使用 linq-to-sql 进行所有查询。

【问题讨论】:

    标签: c# asp.net-mvc entity-framework linq-to-sql ef-code-first


    【解决方案1】:

    您正在寻找many-to-many 关系,可以定义为:

    public class Gift  
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<GiftCategory> Categories { get; set; } // is this incorrect???
        public int Rating { get; set; }
    }
    
    public class GiftCategory
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<Gift> Gifts { get; set; }
    }
    

    所以每个都有另一个的集合。 Gift 有很多 CategoriesCategory 有很多 Gifts。您可以像使用 ConnectGifts 一样使用 bridge 表,但对于 EF 则没有必要。仅使用GiftGiftCategory,EF 将实际为您创建桥接表。

    【讨论】:

    • 但我不想将 GiftCategories 与任何礼物相关联!如果我创建一个包含礼物集合的 GiftCategory,那么它不会将 GiftCategories 与特定礼物联系起来吗?类别只是类别。我不确定这就是我想要的。我不希望 GiftCategories 与任何特定的 Gifts 绑定,但我确实希望 GiftCategories 绑定到 GiftCategories,我不认为!
    • EF 创建了带有 ID 的桥表,但是如果我没有包含桥数据的实体,我将如何使用 linq-to-sql 查询给定类别的所有礼物?
    • 您无需担心。 EF 为您处理所有这些。如果您想要pet 类别的所有礼物,您可以使用var gifts = giftDbSet.Where(m =&gt; m.Category.Name == "pet").ToList()。 EF 将为您处理所有的桥接程序。
    • m => m.Category.Name 来自哪里? M 是来自 GiftCategories 还是 Gift?
    • 它是LINQ。 Where 方法允许我传递lambda in。在 Google 中查找这些术语。他们与 EF 携手并进。但是要回答您的具体问题:在我的示例中, m 将是礼物。 where 方法将遍历giftDbSet 中的每个礼物,并返回满足 lambda 中指定条件的每个项目。那么它实际上并没有返回项目。它实际上只是构建一个查询,只有当我调用 ToList 时才会执行查询。
    猜你喜欢
    • 1970-01-01
    • 2013-09-01
    • 2014-11-22
    • 1970-01-01
    • 2015-03-09
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多