获取实体类型不是当前上下文的模型的一部分

本文关键字:上下文 模型 一部分 类型 实体 model 获取 | 更新日期: 2023-09-27 17:50:06

我有这个问题更新我的数据库1列在asp.net使用web api的时间。我试图查询PUT只是更新一行中的一个值,而不是更新该值并将其余设置为null。我在控制器之外创建了一个单独的模型来接受更新,这样我就可以一次做一个。当我在控制器中点击这行db.Entry(user).State = EntityState.Modified;时,这就是它出错的地方。有什么建议我可以解决这个问题吗?

这是我单独的ViewModel,我在放方法:

namespace WebAPI.Models.ViewModels
{
    public class UserViewModel
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
}

这是我的控制器在参数中调用ViewModel方法:

public HttpResponseMessage PutUser(int id, UserViewModel user)
        {
            HttpResponseMessage response;
            if (db.User.IsInRole("Admin"))
            {
                try
                {
                        db.Entry(user).State = EntityState.Modified;
                        db.SaveChanges();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!UserExists(id))
                    {
                        response = new HttpResponseMessage(HttpStatusCode.NotFound);
                        return response;
                    }
                    else
                    {
                        throw;
                    }
                }
                response = new HttpResponseMessage(HttpStatusCode.NoContent);
                return response;
            }
这是我的DBContext文件:
public partial class Entities : DbContext
    {
        public Entities()
            : base("name=Entities")
        {
        }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }
        public virtual DbSet<User> Users { get; set; }
    }
}

获取实体类型<model>不是当前上下文的模型的一部分

如果您的存储库需要动态访问不同的实体框架DbContext,这意味着不同的数据库,则会发生这种情况。

检查web中的数据连接字符串。

每个实体框架DbContext的配置文件。例如:

 <add name="CRMEntities" connectionString="metadata=res://*/CRMEntities.csdl|res://*/CRMEntities.ssdl|res://*/CRMEntities.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=Your Data Source;initial catalog=CRM;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

检查connectionString中的元数据是否指向正确的DbContext。

在本例中,它指向名为"CRMEntities"的demx文件

错误来自于如何初始化数据上下文db

用户对象已经在单独的db中创建,因此,当您尝试更新user时,当前db不知道这个user对象。

你可以通过获取用户

来解决它
try
{
    // or check on FirstName and LastName if you don't have a user id
    var updatedUser = db.Users.SingleOrDefault(x => x.id == id);
    updatedUser.FirstName = user.FirstName;
    updatedUser.LastName = user.LastName;
    db.Entry(updatedUser).State = EntityState.Modified;
    db.SaveChanges();
 }

或者,您可以确保用于创建user对象的数据上下文与尝试更新用户的数据上下文相同。

这对你有意义吗?

确保您有正确的元数据部分,应该与edmx中相同。

connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;"

更新模型以包含ID属性。

那么做

var e = db.Entry(user);

e.Property(p => p.FirstName).Modified = true;

属性行是用来指定单个字段的。

您的视图模型不是一个完全限定的User对象。因此,您需要获得一个。

这个调用,db.User.IsInRole("Admin"),似乎表明您已经拥有当前用户。你应该修改这个然后提交修改

try
{
    db.User.FirstName = user.FirstName;
    db.User.LastName = user.LastName;
    db.Entry(db.User).State = EntityState.Modified;
    db.SaveChanges();
}

我也一直得到这个异常。我通过右键点击实体解决了这个问题。并通过"Update model From database "刷新到我的数据库的连接。

我不知道为什么它工作,但它确实,至少在我的情况下。

这发生在我身上,因为有人在app.config中通过剪切和粘贴现有的连接字符串创建了一个新的连接字符串。

结果如下:

<connectionStrings>
    <add
        name="Db1Context"
        connectionString="metadata=res://*/Db1Context.csdl|res://*/Db1Context.ssdl|res://*/Db1Context.msl;..."
        providerName="System.Data.EntityClient"
    />
    <add
        name="Db2Context"
        connectionString="metadata=res://*/Db1Context.csdl|res://*/Db1Context.ssdl|res://*/Db1Context.msl;..."
        providerName="System.Data.EntityClient"
    />
</connectionStrings>

注意Db2Context在它的元数据中仍然引用DbContext1…

在我的情况下,问题是在相应的实体文件中不存在一列。在edmx中有一个列映射,但在charp文件中没有

验证服务器是64位还是32位并重新编译应用程序

当我试图将类的实例添加到DbSet时,我也遇到了同样的问题。我的问题是数据库中表的定义与我的实际对象不匹配(我的模型中缺少2个非空属性)。我将这两个属性添加到我的类中,错误就消失了。

我也有同样的问题。我的问题是我没有放任何映射实体/表。在映射了我的实体之后,问题就解决了。

在我的例子中,这是因为错误的引用。我不小心选择了一个与模型类同名的系统类作为引用。

例如,我有一个名为Site的模型类,我不小心在应该使用using MyApplication.Models;的地方选择了using System.Security.Policy;的引用

希望它能帮助到那些犯了这么愚蠢的错误却还在努力弄清楚原因的人。

相关文章: