C# 避免丢失数据注释
我使用的是C# 避免丢失数据注释,c#,entity-framework,asp.net-core,C#,Entity Framework,Asp.net Core,我使用的是ASP.NET Core 2.0和EntityFramwork以及DataAnotations 当我需要从数据库更新模型时,我正在执行: PM: Scaffold-DbContext "Server=localhost;Database=MyDb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -force …从模型中删除数据说明。 我通过使用ViewModel找到
ASP.NET Core 2.0
和EntityFramwork
以及DataAnotations
当我需要从数据库更新模型时,我正在执行:
PM: Scaffold-DbContext "Server=localhost;Database=MyDb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -force
…从模型中删除数据说明。
我通过使用ViewModel
找到了一个解决方法,如下所示:
public class Company
{
public Guid CompanyId { get; set; }
public string Name { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
}
public class VmCompany : Company
{
[Required, DataType(DataType.EmailAddress)]
public new string Email { get; set; }
}
在Create.cshtml.cs中,我正在绑定ViewModelVmCompany
:
[BindProperty]
public VmCompany VmCompany { get; set; }
public async Task<IActionResult> OnGetAsync()
{
...
}
最后在页面上发布:
我正在将数据从ViewModel插入模型
public async Task<IActionResult> OnPostAsync()
{
var company = new Models.Company
{
Name = VmCompany.Name,
CompanyId = VmCompany.CompanyId,
Email = VmCompany.Email,
Phone = VmCompany.Phone,
};
_db.Company.Add(company);
await _db.SaveChangesAsync();
return RedirectToPage("/company/list");
}
公共异步任务OnPostAsync()
{
var公司=新型号。公司
{
Name=VmCompany.Name,
CompanyId=VmCompany.CompanyId,
Email=VmCompany.Email,
Phone=VmCompany.Phone,
};
_db.Company.Add(公司);
等待_db.SaveChangesAsync();
返回重定向Topage(“/公司/列表”);
}
这是可行的,但这是正确的方法吗?有没有一种更简单的方法来保存模型DataStations?正确的方法是不使用持久性模型作为mvc/webapi的返回模型。这两个模型有不同的用途,如果您使用相同的模型,那么当您在持久性模型上更改任何内容时,您的API将始终中断并添加中断更改。持久性模型定义您的数据库模式(当与关系数据库一起使用时)或仅定义一个文档结构(当使用文档数据库时)。从控制器返回的模型是与外部应用程序的合同,具有完全不同的要求,即使属性和类型名称在95%的情况下匹配,合同也必须稳定且不更改,因为对它们的每次更改都会中断使用您服务的所有应用程序,而持久性模型可以更改,只要它不影响契约(即添加可选或内部字段(例如,您不希望API使用者看到的审核信息)或重命名持久性模型/数据库中的列)
public async Task<IActionResult> OnPostAsync()
{
var company = new Models.Company
{
Name = VmCompany.Name,
CompanyId = VmCompany.CompanyId,
Email = VmCompany.Email,
Phone = VmCompany.Phone,
};
_db.Company.Add(company);
await _db.SaveChangesAsync();
return RedirectToPage("/company/list");
}