我正在努力开发一个简单的应用程序。 我有三个通过Entity Framework引入的SQL表,并自动创建了模型。 我希望能够在Visual Studio中自动构建创建/详细信息/编辑等视图。当我从一个模型(例如像Name一样)进行脚手架时,我可以自动执行此操作,但在使用视图模型作为源时无法实现。
以下是我的模特
名称
public partial class Name
{
public Name()
{
this.Addresses = new HashSet<Address>();
this.Emails = new HashSet<Email>();
}
public int ID { get; set; }
public string FIRST_NAME { get; set; }
public string LAST_NAME { get; set; }
public virtual ICollection<Address> Addresses { get; set; }
public virtual ICollection<Email> Emails { get; set; }
}
地址
public partial class Address
{
public int ADDRESS_ID { get; set; }
public int NameID { get; set; }
public string ADDRESS_1 { get; set; }
public string CITY { get; set; }
public string STATE { get; set; }
public string ZIP { get; set; }
public virtual Name Name { get; set; }
}
电子邮件
public partial class Email
{
public int EMAIL_ID { get; set; }
public int NameID { get; set; }
public string EMAIL { get; set; }
public virtual Name Name { get; set; }
}
和我创建的所有三个
的视图模型public class MainVM
{
public Name Name { get; set; }
public Address Address { get; set; }
public Email Email { get; set; }
}
我可以完成创建控制器的步骤 - 右键单击控制器&gt;&gt;添加&gt;&gt;控制器&gt;&gt;带有视图的MVC 5 Controller,使用实体框架。
接下来我进入这个界面。
如果单击“添加”,我将收到以下错误。
我已经读过其他答案,如果您使用的是View Model,则需要清除Data上下文类(来自第一个图像),但如果我这样做,Add按钮将被取消激活。我无法进一步发展。 这里有什么想法吗?
答案 0 :(得分:6)
我打赌原来的海报可能还没有找到答案。但它可以帮助像我这样的寻求者......
发现这篇文章有所帮助。 Link
走路时似乎控制器 - &gt;添加 - &gt;新的脚手架项目 - &gt;带有视图的MVC Controller,使用Entity Framework 对视图模型不起作用。
如果在选择viewmodel时未在上述脚手架进程中提供DataContext类,则MVC脚手架将不允许您继续进行。如您所示,“添加”按钮被禁用。
解决方法是采取两步的方法。
首先使用scaffolding创建控制器操作(控制器 - &gt;添加 - &gt;新的脚手架项目 - &gt;带读/写操作的MVC控制器)
然后通过右键单击各个控制器操作方法然后利用脚手架来添加视图。 (控制器的操作方法 - &gt;右键单击 - &gt;添加视图 - &gt;模板 - &gt; [选择除空(无模型)之外的任何内容] - &gt;模型类 - &gt; [在此处选择您的视图模型] - &gt; < strong>将数据上下文类保留为空 - &gt;现在将启用添加按钮。
链接文章详细介绍了相关步骤请看一下。
但是,您仍然需要自己添加代码以使用控制器操作方法中的Entity框架来使用数据库。 (或者您可以选择介绍Busines图层,存储库等。 YMMV )但这有助于避免编写大量代码来创建视图。
PS:我发现使用ASP.Net核心1.1时这种方法对我来说很合适
答案 1 :(得分:2)
我尝试在控制器中使用View Model并得到相同的错误。然后我添加了一个ID Key来解决错误,EF在我的数据库中创建了一个代表View Model的表。有了这个,我得出结论,View Models不了解数据库,只用于View中的演示。在控制器中,我处理了不同实体的数据库操作。
我必须手动创建一个视图,并在视图中使用@model myproject.ViewModels.MyViewModel来表示Html帮助程序的视图模型。
这个过程对我有用,我能够将信息保存到每个实体模型的正确数据库表中。
以下代码就是一个例子。您可以使用映射工具而不是手动键入代码。使用Entity Framework将视图模型分解为要保存的实体。
public ActionResult EmployeeDepartment(EmployeeViewModel evm)
{
if(ModelState.IsValid)
{
try
{
Department dept = new Department();
dept.DepartmentName = evm.DepartmentName;
dept.DepartmentNumber = evm.DepartmentNumber;
db.Departments.Add(dept);
db.SaveChanges();
Employee emp = new Employee();
emp.FirstName = evm.FirstName;
emp.LastName = evm.LastName;
emp.Department = dept;
db.Employees.Add(emp);
db.SaveChanges();
return RedirectToAction("Index");
}
catch(Exception ex)
{
//write code for exception
}
}
return View();
}
答案 2 :(得分:0)
将数据上下文类保持为空,然后尝试添加视图。它对我有用。另外,将[Key]
添加到任何id属性。