1

私はこの 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 に個別の値を設定しようとしています。

ご協力いただきありがとうございます。

ジャビド

4

1 に答える 1

0

ID表示しているコードでは、Entity Framework は、クラスの (プライマリ) キー プロパティである命名規則を想定していCategoryます。キーは一意である必要があるため、EF はDistinct()LINQ の aSELECT DISTINCTを SQL の a に変換しません。これは、テーブル内のすべてのキー値が必ず異なる必要があるためです。申請SELECT DISTINCTは冗長になります。

ただし、ID列が実際に一意でない場合、それを主キーにすることはできず、モデルとデータベースの間のマッピングが正しくありません。マッピングをオーバーホールする必要があります。

テーブルに主キーである別の列がある場合は、対応するプロパティをモデルに導入し、このプロパティをキー プロパティにする必要があります (データ注釈または Fluent API を使用)。

「レガシー」データベースにマッピングしていて、何らかの理由でテーブルに主キーがまったくない場合、EFを使用してテーブルとモデルクラスの間のマッピングを作成することはできません。マッピングされたすべてのクラスにはデータベース テーブルの主キーに対応するキー プロパティ。おそらく最善の回避策は、ダイレクト SQL ( SELECT DISTINCT) を使用してこの (マップされていない) テーブルにクエリを実行することにより、個別のカテゴリ ID をロードすることです。

于 2012-05-30T23:09:52.310 に答える