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


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

Это моя отдельная модель просмотра, которую я принимаю в 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;
            }

Это мой 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; }
    }
}
10 12

10 ответов:

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

Объект user был создан в отдельном 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, совпадает с тем, который пытается обновить пользователь.

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

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

Проверьте строку подключения к данным в 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 ненулевых свойства отсутствовали в моей модели). Я добавил Эти два свойства в свой класс, и ошибка исчезла.

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