Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# viewmodels需要钥匙吗?_C#_Asp.net Mvc - Fatal编程技术网

C# viewmodels需要钥匙吗?

C# viewmodels需要钥匙吗?,c#,asp.net-mvc,C#,Asp.net Mvc,我有我的视图模型: namespace projInterview.Models { public class QuestionViewModel { public piQuestion Question { get; set; } public List<piAnswer> Answers { get; set; } public piQuestionFavorite QuestionFavorite { get; s

我有我的视图模型:

namespace projInterview.Models
{
    public class QuestionViewModel
    {
        public piQuestion Question { get; set; }
        public List<piAnswer> Answers { get; set; }
        public piQuestionFavorite QuestionFavorite { get; set; }
        public piQuestionLevel QuestionLevel { get; set; }

        public QuestionViewModel(piQuestion question, List<piAnswer> answers )
        {
            Question = question;
            Answers = answers;
        }
    }
}
我得到以下错误:

在模型生成过程中检测到一个或多个验证错误:

projInterview.DAL.QuestionViewModel::EntityType“QuestionViewModel” 没有定义键。定义此EntityType的键。 questionViewModels:EntityType:EntitySet“questionViewModels”为 基于未定义键的“QuestionViewModel”类型

piQuestion
piAnswer
在viewmodel使用的原始模型中都有键。我做错了什么?

等待等待等待。视图模型与实体框架上下文完全无关。它不应该与之关联。你现在看到的是
db.piQuestions
是一个
IQueryable
,这绝对是错误的。视图模型对EF一无所知,EF对视图模型一无所知

永远不要将视图模型映射到任何数据库或EF内容。在DBContext中放置为
IQueryable
属性的是域模型。这些是绑定到数据库表的模型

然后在控制器操作中,对数据库(DbContext)进行一个或多个调用,以检索一个或多个域模型。然后将这些域模型的属性映射(复制)到单个视图模型。最后,将视图模型传递给视图

另外,作为旁注,视图模型通常具有默认构造函数。您不需要那些获取参数的特定构造函数。如果您试图将视图模型作为控制器动作的参数,那么这只会使默认模型绑定器变得疯狂


因此得出结论:视图模型没有任何键。他们甚至不应该知道什么是钥匙。键是特定于数据访问层的东西,也就是说您的域模型。

为了完成:在视图支架中选择模型时,需要域模型,因此它还预填充数据上下文类,因此它需要一个键。选择viewmodel时,只需删除预填充的DAL类,并将DAL字段留空

如果您像我错误地那样为viewmodel定义了一个键,那么架子工会将viewmodel的定义添加到上下文类中。为了弥补我造成的混乱,我从上下文类中删除了viewmodel定义,并从viewmodels中删除了键


是的。。你做错了。您是否将viewmodels映射到数据库?你不能那样做,这太好了。我需要你和我团队中的一个家伙谈谈,他希望基本上通过我们的WCF应用程序堆栈一直使用EF模型。Ie:EF模型是实体模型、DTO和ViewModel的总称。叹气我担心我没有耐心和这样的人交谈:-)我希望(对你和你的团队来说)这个人不是一个决策者。@AaronPalmer,我认为现在是开始寻找更好的工作场所的好时机。@DarinDimitrov-谢谢你的回复。。。然而,我仍然不知道我应该如何设置它?我认为我没有将虚拟机映射到数据库。@webdad3,您将域模型与DbContext关联(也就是说,您将它们作为DbContext的属性)。视图模型是一个与它们完全分离的类。视图模型应仅包含将在视图中使用的属性。然后在控制器操作中,查询DbContext以检索一个或多个域模型(在您的情况下,这可能是问答之类的)。一旦您将这些域模型作为实例,您就可以将必要的属性复制到视图模型中。这是我的解决方案。一切对我来说都是有意义的,视图模型与EF无关,为什么我们需要数据上下文…谢谢,这才是真正的答案
namespace projInterview.Controllers {
    public class QuestionController : Controller
    {
        private ProjectContext db = new ProjectContext();

        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            piQuestion piquestion = db.piQuestions.Single(x => x.QuestionID == id);

            List<piAnswer> piAnswers = db.piAnswers.Where((x => x.QuestionID == id)).ToList();
            var questionViewModel = new QuestionViewModel(piquestion,piAnswers);

            return View(questionViewModel); 
        } 
}
piQuestion piquestion = db.piQuestions.Single(x => x.QuestionID == id);