2014-03-14 3 views
12

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

Это мой отдельный 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; } 
    } 
} 
+1

Можете ли вы опубликовать данные в таблице базы данных? Для вызова «Entry» необходим первичный ключ, чтобы узнать, какая запись обновляется. Ваша модель имеет только имя и фамилию. – jwatts1980

+0

Таблица пользователей состоит из FirstName LastName Email и Password with и Id в качестве первичного ключа. Я пытаюсь обновить только имя FirstName LastName и Email. – Shawn

ответ

12

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

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

+0

Сортировка lol. Я понимаю, что я нашел идентификатор пользователя и ссылаюсь на него, чтобы сохранить новое имя FirstName и LastName, а затем обновить изменения новой переменной в базе данных. Я получаю тот же тип ошибки, что и нижний 2 ответ, где .FirstName и .LastName дает мне сообщение, не содержит определенную ошибку? – Shawn

+0

Я сделал небольшое обновление. Попробуйте 'var updateUser = db.Users.SingleOrDefault (x => x.id == id); вместо этого. Тогда вы обязательно получите один экземпляр вместо 'Where', который действительно просто возвращает результат запроса, когда вы хотите одного пользователя. –

+0

ВЫ - бог среди мужчин сэр. Отмечено, как ответили, и большое спасибо. – Shawn

2

Обновите модель, чтобы включить идентификатор опоры erty.

Затем сделайте

var e = db.Entry(user);

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

Строка свойство, как определить отдельные поля.

+0

Я получаю сообщение об ошибке, которое говорит, что не содержит определения для модифицированного и никакого расширения. Модифицировано принятие первого типа аргумента <сумасшедшая строка>. – Shawn

+0

«Пользователь» должен быть типом в модели сущности, а не вашей пользовательской моделью. – jwatts1980

2

Ваш 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(); 
} 
+0

Для этого я получаю «не содержит определения для« LastName »(хотя это запись в базе данных), принимающего первый аргумент типа ...» Параметры, которые я получаю после db.User. это что-то вроде Any и Find and etc .... – Shawn

24

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

+0

Человек, которого ты спас мне жизнь !!!! Спасибо. –

+0

Пригвожденный. Благодаря! – Sirentec

0

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

+0

Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий ниже своего сообщения - вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы будете быть в состоянии [прокомментировать любое сообщение] (http: // stackoverflow.ком/помощь/льготы/комментарий). - [Из обзора] (/ review/low-quality-posts/11462171) – ryadavilli

+2

@ryadavilli это дает ответ> – Rob

4

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

ConnectionString = "метаданные = Рез: // /Model1.csdl|res:// /Model1.ssdl|res:// */Model1.msl;»

0

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

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

0

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

1

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

0

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

Смежные вопросы