我正在尝试开发一个简单的应用程序。 我通过实体框架引入了三个 SQL 表,并自动创建了模型。 我希望能够在 Visual Studio 中自动构建创建/详细信息/编辑等视图。 当我从单个模型(例如单独的名称)搭建支架时,我可以自动执行此操作,但在使用视图模型作为源时无法到达任何地方。
这是我的模型
姓名
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; }
}
我可以完成创建控制器的步骤 - 右键单击控制器>>添加>>控制器>>带有视图的MVC 5控制器,使用实体框架。
接下来我会看到这个屏幕。
如果我单击“添加”,我将收到以下错误。
我在其他答案中读到,如果您使用视图模型,则需要清除数据上下文类(从第一张图像中),但如果我这样做,“添加”按钮将被停用。 我不能再进一步了。 这里有什么想法吗?
我敢打赌,原来的发帖人此时可能还没有在寻找答案。但它可以帮助像我这样的寻求者..
发现这篇文章有一些帮助。 链接
似乎在采取路线控制器 - >添加 - >新脚手架项目 - >带有视图的MVC控制器时,使用实体框架不适用于视图模型。
如果您在选择视图模型时没有在上述脚手架过程中提供 DataContext 类,MVC 脚手架将不允许您进一步进行。正如您所指出的,“添加”按钮被禁用。
解决方法是采取两步法。
首先使用脚手架创建控制器操作(控制器 -> 添加 -> 新脚手架项 -> 具有读/写操作的 MVC 控制器)
然后通过右键单击各个控制器操作方法并利用脚手架来添加视图。 (控制器的操作方法 -> 右键单击 -> 添加视图 -> 模板 -> [选择除空(无模型)之外的任何内容] -> 模型类 -> [在此处选择您的视图模型] -> 将数据上下文类留空 - > 添加按钮现在将启用)。
链接的文章详细介绍了步骤,请查看。
但是,您仍然需要自己添加代码,以便在控制器操作方法中使用实体框架来处理数据库。 (或者您可以选择引入业务层、存储库等。YMMV)但这有助于避免编写大量代码来创建视图。
PS:我发现在使用 ASP.Net core 1.1 时这种方法对我来说效果很好
我尝试在控制器中使用视图模型并得到相同的错误。然后,我添加了一个 ID 键来解决该错误,并且 EF 在我的数据库中创建了一个表示视图模型的表。由此我得出的结论是,视图模型不了解有关数据库的任何信息,仅用于在视图中呈现。在控制器中,我处理不同实体的数据库操作。
我必须手动创建一个视图,并在视图中使用 @model myproject.ViewModels.MyViewModel 来表示 Html 助手的视图模型。
这个过程对我有用,我能够将信息保存到每个实体模型的正确数据库表中。
以下代码是一个示例。您可以使用映射工具而不是手动键入代码。使用实体框架将视图模型分解为实体以保存。
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();
}
将数据上下文类保留为空,然后尝试添加视图。这对我有用。另外,将
[Key]
添加到任何 id 属性。
如果您重命名 DbContext,它会强制您使用,即“NorthWindEntities”为“NorthWindEntities2”(单击类名并执行 CTRL+R),这将清除数据上下文类字段,从而允许您搭建控制器/没有 DbContext 的视图。
这很可能是一个永远无法修复的错误。 设计 UI 的白痴可能从来没有听说过 ViewModel。
上述答案并没有真正提供解决方案,只是一种替代方案。