Получение "Тип объекта <модель> не является частью модели для текущего контекста".
У меня возникла проблема с обновлением колонки 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; }
}
}
Ответы
Ответ 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="data source=Your Data Source;initial catalog=CRM;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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