是否可以使用 entity framework 数据库优先方法从数据库表创建的模型中创建视图模型?
Is it possible to create view models by out of models created from database tables using entity framework DB first approach?
自从我开始使用 entity framework 的 DATABASE FIRST 方法以来。它很容易上手,也很有趣,但有一件事让我很困惑。
在 MVC 中,我们通常制作视图模型(具有加减属性的模型,因此它符合特定视图)。很好,但是当使用 EF 和 DB 优先方法时,这似乎是不可能的。因为我们从数据库 table 创建了一个模型,然后继续使用它进行插入、更新、select 或任何操作。
例如
服务模式:
namespace ZahidCarWash.Models.EF
{
using System;
using System.Collections.Generic;
public partial class Services
{
public short ServiceID { get; set; }
public string ServiceName { get; set; }
public Nullable<decimal> ServicePrice { get; set; }
public Nullable<System.DateTime> EntryDateTime { get; set; }
public Nullable<bool> IsOwner { get; set; }
public Nullable<decimal> Commission { get; set; }
}
}
然后在控制器中使用它。
[HttpPost]
public JsonResult UpdateServices(Services UpdateServicesVM)
{
ServicesRepository ServicesRep = new ServicesRepository();
int i = 0;
//i = ServicesRep.UpdateServices(UpdateServicesVM, out ReturnStatus, out ReturnMessage);
ZahidCarWashDBEntities zjdb = new ZahidCarWashDBEntities();
zjdb.Entry(UpdateServicesVM).State = EntityState.Modified;
i= zjdb.SaveChanges();
return Json(new { ReturnMessageJSON = i > 0 ? "Success" : "Error", ReturnStatusJSON = i > 0 ? true : false });
}
或
[HttpPost]
public JsonResult AddServices(Services AddServicesVM)
{
ServicesRepository ServicesRep = new ServicesRepository();
int i = 0;
//i = ServicesRep.InsertServices(AddServicesVM, out ReturnStatus, out ReturnMessage);
ZahidCarWashDBEntities context = new ZahidCarWashDBEntities();
context.Services.Add(AddServicesVM);
context.SaveChanges();
return Json(new { ReturnMessageJSON = ReturnMessage, ReturnStatusJSON = ReturnStatus });
}
我通过 adding/removing 属性创建了其他自定义模型,但这听起来不太好。有什么好的方法或 EF 提供的吗?
您在这里混合了两个东西:数据库实体(实体数据模型)和视图模型,这是两个不同的概念。
数据模型:这是一个简单的class与指定的table相关
数据库,可以在代码中用作数据模型。
View Model: 从概念上讲,它与MV*架构模式有关,用于传递数据to/from一个视图。使其与您的 UI 逻辑相关。
要在使用 Entity Framework 的 MVC 应用程序中实现这两个概念,请将数据库 table 视为数据实体,并使其仅用于与数据库通信。要执行 CRUD 操作并将数据传入和传出视图,请使用视图模型。
示例:
数据模型
namespace ZahidCarWash.Models.EF
{
using System;
using System.Collections.Generic;
public partial class Services
{
public short ServiceID { get; set; }
public string ServiceName { get; set; }
public Nullable<decimal> ServicePrice { get; set; }
public Nullable<System.DateTime> EntryDateTime { get; set; }
public Nullable<bool> IsOwner { get; set; }
public Nullable<decimal> Commission { get; set; }
}
}
查看模型
namespace ZahidCarWash.Models
{
using System;
using System.Collections.Generic;
public class ServiceViewModel
{
public short ServiceID { get; set; }
public string ServiceName { get; set; }
public decimal ServicePrice { get; set; }
public System.DateTime EntryDateTime { get; set; }
public bool IsOwner { get; set; }
public decimal Commission { get; set; }
}
}
控制器
[HttpPost]
public JsonResult AddServices(ServiceViewModel model)
{
if(model == null)
return null;
var addService = new Services();
//Use Automapper for mapping view models to data entities
addService.ServiceID = model.ServiceID ; //Service Id should be auto incremented from database
addService.ServiceName = model.ServiceName ;
addService.ServicePrice = model.ServicePrice ;
addService.EntryDateTime = model.EntryDateTime ;
addService.IsOwner = model.IsOwner ;
addService.Commission = model.Commission ;
ServicesRepository servicesRep = new ServicesRepository();
int i = 0;
//i = ServicesRep.UpdateServices(UpdateServicesVM, out ReturnStatus, out ReturnMessage);
//Don't write the data specific logic in controllers. Use Repository Pattern.
ZahidCarWashDBEntities context = new ZahidCarWashDBEntities();
context.Services.Add(addService);
context.SaveChanges();
return Json(new { ReturnMessageJSON = ReturnMessage, ReturnStatusJSON = ReturnStatus });
注意: 在上面的代码中,我描述了在 MVC 应用程序中使用视图模型和数据实体的简单流程。在现实世界的项目中,人们会考虑更多类似 Repository Pattern to perform CRUD operation, Separation of Concerns principle (it is not advisable to perform database operations in action methods of a controller). Also to map different entities, we can use Automapper 的事情。还有很多其他因素需要检查,但您可以了解您的疑问。
自从我开始使用 entity framework 的 DATABASE FIRST 方法以来。它很容易上手,也很有趣,但有一件事让我很困惑。
在 MVC 中,我们通常制作视图模型(具有加减属性的模型,因此它符合特定视图)。很好,但是当使用 EF 和 DB 优先方法时,这似乎是不可能的。因为我们从数据库 table 创建了一个模型,然后继续使用它进行插入、更新、select 或任何操作。
例如
服务模式:
namespace ZahidCarWash.Models.EF
{
using System;
using System.Collections.Generic;
public partial class Services
{
public short ServiceID { get; set; }
public string ServiceName { get; set; }
public Nullable<decimal> ServicePrice { get; set; }
public Nullable<System.DateTime> EntryDateTime { get; set; }
public Nullable<bool> IsOwner { get; set; }
public Nullable<decimal> Commission { get; set; }
}
}
然后在控制器中使用它。
[HttpPost]
public JsonResult UpdateServices(Services UpdateServicesVM)
{
ServicesRepository ServicesRep = new ServicesRepository();
int i = 0;
//i = ServicesRep.UpdateServices(UpdateServicesVM, out ReturnStatus, out ReturnMessage);
ZahidCarWashDBEntities zjdb = new ZahidCarWashDBEntities();
zjdb.Entry(UpdateServicesVM).State = EntityState.Modified;
i= zjdb.SaveChanges();
return Json(new { ReturnMessageJSON = i > 0 ? "Success" : "Error", ReturnStatusJSON = i > 0 ? true : false });
}
或
[HttpPost]
public JsonResult AddServices(Services AddServicesVM)
{
ServicesRepository ServicesRep = new ServicesRepository();
int i = 0;
//i = ServicesRep.InsertServices(AddServicesVM, out ReturnStatus, out ReturnMessage);
ZahidCarWashDBEntities context = new ZahidCarWashDBEntities();
context.Services.Add(AddServicesVM);
context.SaveChanges();
return Json(new { ReturnMessageJSON = ReturnMessage, ReturnStatusJSON = ReturnStatus });
}
我通过 adding/removing 属性创建了其他自定义模型,但这听起来不太好。有什么好的方法或 EF 提供的吗?
您在这里混合了两个东西:数据库实体(实体数据模型)和视图模型,这是两个不同的概念。
数据模型:这是一个简单的class与指定的table相关 数据库,可以在代码中用作数据模型。
View Model: 从概念上讲,它与MV*架构模式有关,用于传递数据to/from一个视图。使其与您的 UI 逻辑相关。
要在使用 Entity Framework 的 MVC 应用程序中实现这两个概念,请将数据库 table 视为数据实体,并使其仅用于与数据库通信。要执行 CRUD 操作并将数据传入和传出视图,请使用视图模型。
示例:
数据模型
namespace ZahidCarWash.Models.EF
{
using System;
using System.Collections.Generic;
public partial class Services
{
public short ServiceID { get; set; }
public string ServiceName { get; set; }
public Nullable<decimal> ServicePrice { get; set; }
public Nullable<System.DateTime> EntryDateTime { get; set; }
public Nullable<bool> IsOwner { get; set; }
public Nullable<decimal> Commission { get; set; }
}
}
查看模型
namespace ZahidCarWash.Models
{
using System;
using System.Collections.Generic;
public class ServiceViewModel
{
public short ServiceID { get; set; }
public string ServiceName { get; set; }
public decimal ServicePrice { get; set; }
public System.DateTime EntryDateTime { get; set; }
public bool IsOwner { get; set; }
public decimal Commission { get; set; }
}
}
控制器
[HttpPost]
public JsonResult AddServices(ServiceViewModel model)
{
if(model == null)
return null;
var addService = new Services();
//Use Automapper for mapping view models to data entities
addService.ServiceID = model.ServiceID ; //Service Id should be auto incremented from database
addService.ServiceName = model.ServiceName ;
addService.ServicePrice = model.ServicePrice ;
addService.EntryDateTime = model.EntryDateTime ;
addService.IsOwner = model.IsOwner ;
addService.Commission = model.Commission ;
ServicesRepository servicesRep = new ServicesRepository();
int i = 0;
//i = ServicesRep.UpdateServices(UpdateServicesVM, out ReturnStatus, out ReturnMessage);
//Don't write the data specific logic in controllers. Use Repository Pattern.
ZahidCarWashDBEntities context = new ZahidCarWashDBEntities();
context.Services.Add(addService);
context.SaveChanges();
return Json(new { ReturnMessageJSON = ReturnMessage, ReturnStatusJSON = ReturnStatus });
注意: 在上面的代码中,我描述了在 MVC 应用程序中使用视图模型和数据实体的简单流程。在现实世界的项目中,人们会考虑更多类似 Repository Pattern to perform CRUD operation, Separation of Concerns principle (it is not advisable to perform database operations in action methods of a controller). Also to map different entities, we can use Automapper 的事情。还有很多其他因素需要检查,但您可以了解您的疑问。