1

私はEntityFrameworkのコードファースト機能を使用しており、独自のプロパティを持つこのフィールドを使用してモデルクラスを作成しました(ここでは言及しません!):

public class Portrait
{
        private Guid _id;
        private string _aboutimage;
        private string _aboutMe;
        private string _mainMenu;
        private string _headerImage;
        private string _resume;
        private string _showpiece;
        private string _siteMenu;
        private string _adminMenu;
}

このクラスの各部分には、個別のViewModelがあります。たとえば、管理部分でAboutViewModel更新Aboutし、Webサイトのページについてナビゲートする必要があります。

public class AboutViewModel
{
        public Guid Id { get; set; }
        public string AboutText { get; set; }
        public string Image { get; set; }
}

これで、データベースのテーブルを更新するとAboutViewModelPortraitテキストに関するレコードが作成されます(他のフィールドはnullになります)

そして、他のようなこのテーブルの他の部分を更新するために、Resume更新され挿入されたフィールドを持つ別のレコードが生成されます(このレコードのテキストに関するものはnullになります!)

いくつかのレコードがあるので、UIに表示するaboutフィールドを取得するにはどうすればよいですか?私はこれらのフィールドをIDで取得したくないし、IDで取得することもできません。これは、常に最新の更新をWebサイトに表示したいためです。私が書いたものは次のとおりです。テキストについて取得するためのアクションについては、次のようになります。

public ViewResult About()
{
            var about= _portraitRepository.GetContent();

            return View(about);
}

そして、GetContent()これはこのようなものです:

public Portrait GetContent()
{
            return _siteContext.Portraits.Find();
}

しかし、動作せず、このエラーが発生しました:

渡される主キー値の数は、エンティティで定義されている主キー値の数と一致する必要があります。パラメータ名:keyValues

私は間違った方向にいますか?どうすればこの問題を解決できますか?

4

3 に答える 3

7

もう 1 つのオプションは、ID 列の場合、Portrait テーブルのIdの最大値を取得することです。

アクションは以下のようになります。

public ActionResult About()
{
    var about= _portraitRepository.GetLatest();
}

リポジトリは以下のようになります。

public Portrait GetLatest()
{
    var latestId = _siteContext.Portraits.Max(p => p.Id);
    return _siteContext.Portraits.Find(latestId);
}
于 2013-02-12T18:31:05.020 に答える
1

挿入を実行するときにIDを取得する必要があります。次に、その値をSessionなどに保存して、後でAboutActionで使用できるようにします。

挿入を実行するためのリポジトリへの呼び出しは、次のようになります。

Session["LatestPortraitId"] = _portraitRepository.AddPortrait();

新しいPortraitを挿入するために使用されるPortraitリポジトリのメソッドは、次のようになります。

public int AddPortrait(portrait)
{
    _siteContext.AddObject(portrait);
    _siteContext.SaveChanges();
    return portrait.Id;
}

Aboutアクションは次のようになります。

public ActionResult About()
{
    var latestPortraitId = Int.Parse(Session["LatestPortraitId"]); 
    var about= _portraitRepository.GetContent(latestPortraitId);
}

リポジトリ内は以下のようになります。

public Portrait GetContent(int id)
{
    return _siteContext.Portraits.Find(id);
}
于 2013-02-12T12:37:13.703 に答える