我是这个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
答案 0 :(得分:0)
在显示的代码中,实体框架通过命名约定来假定ID
是Category
类的(主要)键属性。因为密钥必须是唯一的,所以EF不会将LINQ中的Distinct()
转换为SQL中的SELECT DISTINCT
,因为表中的所有键值必须是不同的。应用SELECT DISTINCT
将是多余的。
但是,如果您的ID
列实际上不是唯一的,则它不能是主键,并且模型和数据库之间的映射不正确。你应该彻底检查映射。
如果表中有另一列是主键,则应在模型中引入相应的属性,并使此属性成为键属性(使用数据注释或Fluent API)。
如果您要映射到“遗留”数据库,并且由于某种原因该表没有主键,那么您不能在使用EF创建表和模型类之间的映射,我相信,因为每个映射class需要一个与数据库表中的主键对应的键属性。您最好的解决方法可能是使用直接SQL(SELECT DISTINCT
)来查询此(未映射)表来加载不同的类别ID。