2012-05-30 3 views
1

Я очень новичок в этой структуре MVC и пытаюсь выяснить очень простую операцию. Заполните раскрывающийся список из базы данных. Мне удалось получить список значений из БД, но по какой-то причине не удалось получить отдельный список. Вот мой пример кодаASP.Net MVC Population dropdown из базы данных с отличными значениями

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(); 
    } 
} 

В моем выпадающем списке всегда есть несколько элементов с одинаковым значением идентификатора. В таблице есть повторяющиеся значения, но я пытаюсь просто заполнить DDL с помощью Distinct.

Благодарим за помощь.

Джавид

ответ

0

В коде вы показываете Entity Framework предполагает путем именования, что ID является (основным) Ключевым свойством Category класса. Поскольку ключ должен быть уникальным, EF не переводит Distinct() в LINQ в SELECT DISTINCT в SQL, потому что все значения ключа в таблице должны быть обязательно разными. Применение SELECT DISTINCT будет излишним.

Однако, если ваш столбец ID на самом деле не является уникальным, он не может быть первичным ключом и неверно отображать между вашей моделью и базой данных. Вы должны пересмотреть картографию.

Если в таблице есть другой столбец, который является основным ключом, вы должны ввести соответствующее свойство в модель и сделать это свойство ключевым свойством (используя аннотации данных или Fluent API).

Если вы привязываетесь к базе данных «устаревшей», и по какой-либо причине в таблице нет первичного ключа, вы не можете создать сопоставление между таблицей и классом модели вообще с EF, я считаю, потому что каждый сопоставленный класс требует свойства ключа, которое соответствует первичному ключу в таблице базы данных. Лучшим решением проблемы может быть загрузка отдельных идентификаторов категорий с помощью прямого SQL (SELECT DISTINCT) для запроса этой (не отображаемой) таблицы.

+0

спасибо. В моем случае в таблице, которую я пытаюсь запросить, есть две категории столбцов и продукт. Мне нужно получить список отдельных категорий. В этом случае, как я могу определить объект, который сопоставляется с таблицей с несколькими столбцами, но мой объект имеет только один столбец как свойство? – user320587

+0

@ user320587: Это невозможно. Каков первичный ключ в таблице базы данных? 'ProductId' или' CategoryId' + 'ProductId' (составной ключ)? Вам необходимо сопоставить этот ключ базы данных с ключом в вашем классе модели. – Slauma

+0

Спасибо. В представлении в БД нет ПК, так как большая часть моей работы только для чтения. В моем EF я обозначил два столбца как «Ключ» для создания композита и, похоже, работает нормально. Большое спасибо за Вашу помощь. – user320587

Смежные вопросы