Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 避免丢失数据注释_C#_Entity Framework_Asp.net Core - Fatal编程技术网

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中,我正在绑定ViewModel
VmCompany

[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");
            }