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