2012-05-30 35 views
1

我對這個MVC框架非常陌生,並試圖找出一個非常簡單的操作 - 從數據庫填充下拉列表。我設法從數據庫中獲取值的列表,但由於某種原因無法獲得明確的列表。這裏是我的示例代碼ASP.Net 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值相同的項目。該表具有重複的值,但我試圖用不同的DDL填充DDL。

感謝您的幫助。

Javid

回答

0

在你是顯示實體框架的代碼假定由命名慣例IDCategory類的(初級)關鍵屬性。因爲密鑰必須是唯一的,所以EF不會將LINQ中的Distinct()轉換爲SQL中的SELECT DISTINCT,因爲表中的所有鍵值必須不同。申請SELECT DISTINCT將是多餘的。

但是,如果您的ID列實際上不是唯一的,則它不能是主鍵,並且模型和數據庫之間的映射不正確。你應該檢查映射。

如果表中有另一列是主鍵,則應在模型中引入相應的屬性,並將此屬性作爲關鍵屬性(使用數據註釋或Fluent API)。

如果你正在映射到一個「傳統」數據庫,並且由於某種原因該表根本沒有主鍵,那麼你就不能根據EF來創建表和模型類之間的映射,我相信,因爲每一個映射類需要與數據庫表中的主鍵相對應的鍵屬性。您最佳的解決方法可能是通過使用直接SQL(SELECT DISTINCT)來查詢此(未映射)表來加載不同的類別ID。

+0

謝謝。在我的情況下,我試圖查詢的表有兩個列類別和產品。我需要獲得不同類別的清單。在這種情況下,如何定義映射到具有多列的表的實體,但實體只有一列作爲特權? – user320587

+0

@ user320587:這是不可能的。數據庫表中的主鍵是什麼? 'ProductId'或'CategoryId' +'ProductId'(複合鍵)?您需要將此數據庫鍵映射到模型類中的鍵。 – Slauma

+0

謝謝。 DB中的視圖沒有任何PK,因爲我的大部分工作都是隻讀的。在我的EF中,我將兩列標記爲Key來創建組合,並且它似乎工作正常。非常感謝你的幫助。 – user320587