Получение "тип сущности не является частью модели для текущего контекста."

у меня эта проблема с обновлением моей базы данных 1 столбец за раз в asp.net использование веб-api. Я пытаюсь запросить PUT, чтобы просто обновить одно значение в строке вместо обновления этого и установки остального значения null. Я сделал отдельную модель вне контроллера, чтобы принять обновление, чтобы я мог делать по одному за раз. Когда я попал в эту строку db.Entry(user).State = EntityState.Modified; в контроллере, где он ошибается. Любой совет, как я могу это исправить?

Это моя отдельная ViewModel я принимаю в в методе put:

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;
            }

Это мой :

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; }
    }
}

10 ответов


ошибка происходит от того, как вы инициализировать контекст данных db.

объект пользователя был создан в отдельном db, поэтому, когда вы пытаетесь обновить user текущая БД не знает об этом 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 объект такой же, как тот, который пытается обновить пользователя.

имеет ли это смысл для вас?


это всегда происходило, если вашему репозиторию требуется динамический доступ к другому DbContext Entity Framework, что означает разные базы данных.

Проверьте строку подключения в web.конфигурационный файл для каждого объекта Frmework 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.

в этом примере он указывает на файл demx под названием "CRMEntities".


убедитесь, что у вас есть правильная часть метаданных должна быть такой же, как в 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;

строка свойств - это способ указания отдельных полей.


ваш viewmodel не является полным пользовательским объектом. Как таковой, вам нужно будет получить один.

этот вызов, db.User.IsInRole("Admin"), кажется, указывает, что у вас уже есть текущий пользователь. Вы должны просто изменить это, а затем отправить это для изменений

try
{
    db.User.FirstName = user.FirstName;
    db.User.LastName = user.LastName;

    db.Entry(db.User).State = EntityState.Modified;
    db.SaveChanges();
}

Я тоже получаю это исключение. Я решил это, щелкнув правой кнопкой мыши по сущности.модель edmx на диаграмме и обновление подключения к моей базе данных с помощью "обновить модель из базы данных".

Я не знаю, почему это сработало, но он, по крайней мере в моем случае.


Это случилось со мной потому, что кто-то создал новую строку подключения в приложении.конфигурации путем вырезания и вставки из существующего.

результат выглядел так:

<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 в его метаданных...


убедитесь, что сервер 64 или 32 бита и перекомпилировать приложение.


У меня была такая же проблема с получением исключения, когда я пытался добавить экземпляр моего класса в DbSet. Моя проблема заключалась в том, что определение таблицы в базе данных не соответствовало моему объекту acutal (в моей модели отсутствовали 2 ненулевых свойства). Я добавил два свойства в свой класс, и ошибка исчезла.


У меня была та же проблема. Моя проблема заключалась в том, что я не помещаю объект/таблицу сопоставления. После сопоставления моей сущности проблема была решена.