Подтвердить что ты не робот

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

У меня возникла проблема с обновлением колонки 1 базы данных за один раз в asp.net с помощью web 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;
            }

Это мой файл 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; }
    }
}
4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Убедитесь, что у вас правильная часть метаданных должна быть такой же, как в edmx.

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

Ответ 4

Обновите модель, чтобы включить свойство ID.

Тогда do

var e = db.Entry(user);

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

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

Ответ 5

Ваша модель просмотра не является полностью квалифицированным пользователем. Таким образом, вам нужно будет получить его.

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

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

Ответ 11

В моем случае проблема заключалась в том, что в соответствующем файле объекта не было одного столбца. Одно сопоставление столбцов было в edmx, но не было в файле charp