Asp.net mvc ASP MVC使用实体类型的远程验证抛出错误不是当前上下文模型的一部分
因此,我使用的是一个ASP MVC实体框架,我无法控制数据库的结构,因此首先使用数据库,我使用Asp.net mvc ASP MVC使用实体类型的远程验证抛出错误不是当前上下文模型的一部分,asp.net-mvc,entity-framework,asp.net-mvc-4,asp.net-mvc-5,Asp.net Mvc,Entity Framework,Asp.net Mvc 4,Asp.net Mvc 5,因此,我使用的是一个ASP MVC实体框架,我无法控制数据库的结构,因此首先使用数据库,我使用AutomaticMigrationsEnabled=false禁用了迁移。数据库中有一个名为tblUser的表,它是EF的一部分,首先数据库和EF一切正常,但当我尝试扩展tblUser并添加MVC Remote时,出现了问题,它实际上在视图中工作正常,但当我到达saveChanges()部分时会抛出错误。下面是我的tblUserEF的代码: namespace MyProject.Models {
AutomaticMigrationsEnabled=false禁用了迁移代码>。数据库中有一个名为tblUser
的表,它是EF的一部分,首先数据库和EF一切正常,但当我尝试扩展tblUser
并添加MVC Remote时,出现了问题,它实际上在视图中工作正常,但当我到达saveChanges()
部分时会抛出错误。下面是我的tblUser
EF的代码:
namespace MyProject.Models
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
public partial class tblUser
{
[Key]
public int Id { get; set; }
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
[Required]
public virtual string EmployeeNumber { get; set; }
}
}
然后,我的自定义扩展CreateUserModel
从tblUser
派生:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MyProject.Models
{
public partial class CreateUserModel : tblUser
{
[Required(ErrorMessageResourceType = typeof(Resources.Admin), ErrorMessageResourceName = "Required")]
[Remote("IsEmployeeNumberAvailable", "User", HttpMethod = "POST", ErrorMessageResourceType = typeof(Resources.Admin), ErrorMessageResourceName = "UserNameAlreadyExistError")]
[RegularExpression(@"(\S)+", ErrorMessageResourceType = typeof(Resources.Admin), ErrorMessageResourceName = "WhiteSpaceNotAllowedError")]
[Editable(true)]
public override string EmployeeNumber { get; set; }
}
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(CreateUserModel user, FormCollection collection)
{
if (ModelState.IsValid)
{
// Step #1 - Save the User info
user.CreatedDate = DateTime.Now;
user.ModifiedDate = DateTime.Now;
_dbCtx.Entry(user).State = EntityState.Added;
_dbCtx.SaveChanges();
}
}
无需包含我的IsEmployeeNumberAvailable
代码,因为在我看来它运行良好。myUserController中的Create
函数的my code
:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MyProject.Models
{
public partial class CreateUserModel : tblUser
{
[Required(ErrorMessageResourceType = typeof(Resources.Admin), ErrorMessageResourceName = "Required")]
[Remote("IsEmployeeNumberAvailable", "User", HttpMethod = "POST", ErrorMessageResourceType = typeof(Resources.Admin), ErrorMessageResourceName = "UserNameAlreadyExistError")]
[RegularExpression(@"(\S)+", ErrorMessageResourceType = typeof(Resources.Admin), ErrorMessageResourceName = "WhiteSpaceNotAllowedError")]
[Editable(true)]
public override string EmployeeNumber { get; set; }
}
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(CreateUserModel user, FormCollection collection)
{
if (ModelState.IsValid)
{
// Step #1 - Save the User info
user.CreatedDate = DateTime.Now;
user.ModifiedDate = DateTime.Now;
_dbCtx.Entry(user).State = EntityState.Added;
_dbCtx.SaveChanges();
}
}
最后是抛出的错误:
The entity type CreateUserModel is not part of the model for the current context.
现在我知道,CreateUserModel
不是我的EF映射图的一部分,我知道它会因此失败,但我只是认真地扩展了tblUser
模型,因为创建操作,因为我不希望它阻止我的编辑操作。我没有添加任何新的内容,我的意思是没有新的字段,我只是出于验证目的扩展了员工编号。哦,我还在DbContext
中添加了DbSet
,如下所示:
public DbSet<CreateUserModel> CreateUserModel { get; set; }
public DbSet CreateUserModel{get;set;}
创建一个tblUser
实体,复制属性并将该实体添加到上下文:
var tblUser = new tblUser
{
CreatedDate = DateTime.Now,
ModifiedDate = DateTime.Now,
FirstName = user.FirstName,
LastName = user.LastName,
// etc.
}
_dbCtx.Users.Add(tblUser);
_dbCtx.SaveChanges();
(或者使用AutoMapper之类的工具来支持属性复制)
EF实际上只理解“注册”为实体的类,而不理解派生类,即使派生类没有添加或修改任何属性,并且是完全空的
DbSet
(显然您试图将派生类注册为实体)没有效果,因为您不是先使用代码,而是先使用数据库,在这种情况下,模型不是从代码而是从EDMX图推断出来的。在EDMX中,CreateUserModel
仍然是未知的——我相信,将一个(甚至每个)视图模型声明为持久化模型将是对关注点分离原则的严重违反。保存几行枯燥的属性复制不值得造成架构混乱。感谢您的回答,尽管mytblUser
确实存在于我的EF中,但CreateUserModel
不存在。正如您所说,我将删除DbSet
,因为它不属于那里。我认为我必须从CreateUserModel
转换为tblUser
,以便EF知道it@ghiscoding:啊,演员,好主意。让我知道这是否有效。我不确定EF是否会高兴,或者它是否会检查对象的实际运行时类型(不会随着强制转换而改变)。Thx获取回复。。。实际的强制转换并不直接起作用,但将属性从一个传递到另一个起作用,即在tblUser
的新对象上。我得到一位同事的帮助:)我会+1你的答案,但我明天会写我的答案。。。Thx againI刚刚意识到你得到了正确的答案,哈哈,我只是误读了……干得好;)