1

我对这个 MVC 框架非常陌生,并试图找出一个非常简单的操作 - 从数据库中填充下拉列表。我设法从数据库中获取了一个值列表,但由于某种原因无法获得一个不同的列表。这是我的示例代码

public class HomeController : Controller
{
    private PlanContext _context = new PlanContext();
    public ActionResult Index()
    {
        var query = _context.Categories.Select(m => new { m.ID }).Distinct();
        ViewBag.CategoryID = new SelectList(query.AsEnumerable(), "ID", "ID");
        return View();
    }
}

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<p>
    Select a Category:<%= Html.DropDownList("ID", (SelectList) ViewBag.CategoryID, "---Select One---") %>
</p>
</asp:Content>

public class PlanContext : DbContext
{
    public DbSet<Category> Categories { get; set; }
}

[Table("vCategory")]
public class Category : IEquatable<Category>
{
    [Column("CategoryID")]
    public int ID { get; set; }

    public bool Equals(Category other)
    {
        //Check whether the compared object is null.
        if (Object.ReferenceEquals(other, null)) return false;

        //Check whether the compared object references the same data.
        if (Object.ReferenceEquals(this, other)) return true;

        return ID == other.ID;
    }

    public override int GetHashCode()
    {
        return ID.GetHashCode();
    }
}

我的下拉菜单总是有多个具有相同 ID 值的项目。该表确实有重复的值,但我试图用 Distinct 填充 DDL。

谢谢你的帮助。

贾维德

4

1 回答 1

0

在代码中,您显示的实体框架通过命名约定假定ID为类的(主要)关键属性Category。因为键必须是唯一的,所以 EF 不会将Distinct()LINQ 中的 a 转换为SELECT DISTINCTSQL 中的 a,因为表中的所有键值都必须不同。申请SELECT DISTINCT将是多余的。

但是,如果您的ID列实际上不是唯一的,则它不能是主键,并且您的模型和数据库之间的映射不正确。您应该彻底检查映射。

如果表有另一列是主键,则应在模型中引入相应的属性并将此属性设为键属性(使用数据注释或 Fluent API)。

如果您要映射到“旧版”数据库,并且由于某种原因该表根本没有主键,那么我相信,您根本无法使用 EF 在表和模型类之间创建映射,因为每个映射的类都需要key 属性,对应于数据库表中的主键。您最好的解决方法可能是通过使用直接 SQL ( SELECT DISTINCT) 来查询此(未映射的)表来加载不同的类别 ID。

于 2012-05-30T23:09:52.310 回答