通过实体框架获取最新的表记录

时间:2013-02-12 11:47:08

标签: asp.net-mvc entity-framework

我正在使用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并在网站的大约页面中导航:

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

现在,当我更新AboutViewModel时,数据库中的Portrait表将创建一个关于文本的记录(其他字段将为null)

为了更新此表的其他部分,如Resume或其他部分,它将生成另一个带有更新和插入字段的记录(现在在此记录中有关文本将为空!)

现在我怎么能得到about字段在UI中显示它,因为我有几条记录!我不想也不能通过ID获取这些字段,因为我总是希望将最新的更新显示在网站上,我写的是这样的,我关于获取about文本的动作是这样的:< / p>

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

            return View(about);
}

并且GetContent()是这样的:

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

但是没有用,我收到了这个错误:

  

传递的主键值的数量必须与实体上定义的主键值的数量相匹配。参数名称:keyValues

我的方向错了吗?我该如何解决这个问题?

3 个答案:

答案 0 :(得分:6)

另一个选项是获取肖像表 ID 的最大值,如果它是标识列

行动将如下所示。

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

存储库将如下所示。

public Portrait GetLatest()
{
    var latestId = _siteContext.Portraits.Max(p => p.Id);
    return _siteContext.Portraits.Find(latestId);
}

答案 1 :(得分:1)

执行插入时应检索ID。然后将该值保存到Session或其他内容供稍后在“关于操作”

中使用

对存储库进行插入操作的调用将如下所示。

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

用于插入新Portrait的Portrait存储库中的方法应如下所示。

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

“关于”操作将如下所示。

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

在存储库中,它应如下所示。

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

答案 2 :(得分:0)

通过后代Id订购搜索,然后使用第一个属性