ASP.Net MVC从具有不同值的数据库填充下拉列表

时间:2012-05-30 22:40:11

标签: linq entity-framework

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

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值的项目。该表确实有重复的值,但我试图用不同的DDL填充DDL。

感谢您的帮助。

Javid

1 个答案:

答案 0 :(得分:0)

在显示的代码中,实体框架通过命名约定来假定IDCategory类的(主要)键属性。因为密钥必须是唯一的,所以EF不会将LINQ中的Distinct()转换为SQL中的SELECT DISTINCT,因为表中的所有键值必须是不同的。应用SELECT DISTINCT将是多余的。

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

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

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