Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.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
Asp.net mvc ASP MVC使用实体类型的远程验证抛出错误不是当前上下文模型的一部分_Asp.net Mvc_Entity Framework_Asp.net Mvc 4_Asp.net Mvc 5 - Fatal编程技术网

Asp.net 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 {

因此,我使用的是一个ASP MVC实体框架,我无法控制数据库的结构,因此首先使用数据库,我使用
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
代码,因为在我看来它运行良好。my
UserController中的
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
仍然是未知的——我相信,将一个(甚至每个)视图模型声明为持久化模型将是对关注点分离原则的严重违反。保存几行枯燥的属性复制不值得造成架构混乱。

感谢您的回答,尽管my
tblUser
确实存在于我的EF中,但
CreateUserModel
不存在。正如您所说,我将删除
DbSet
,因为它不属于那里。我认为我必须从
CreateUserModel
转换为
tblUser
,以便EF知道it@ghiscoding:啊,演员,好主意。让我知道这是否有效。我不确定EF是否会高兴,或者它是否会检查对象的实际运行时类型(不会随着强制转换而改变)。Thx获取回复。。。实际的强制转换并不直接起作用,但将属性从一个传递到另一个起作用,即在
tblUser
的新对象上。我得到一位同事的帮助:)我会+1你的答案,但我明天会写我的答案。。。Thx againI刚刚意识到你得到了正确的答案,哈哈,我只是误读了……干得好;)