Получение " тип сущности не является частью модели для текущего контекста."
У меня есть эта проблема обновления моей базы данных 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 ответов:
Ошибка возникает из-за того, как вы инициализируете контекст данных
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="data source=Your Data Source;initial catalog=CRM;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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 модель на диаграмме и обновление соединения с моей базой данных через "обновить модель из базы данных".
Я не знаю, почему это сработало, но это сработало, по крайней мере в моем случае.
Это произошло со мной, потому что кто-то создал новую строку подключения в приложении.конфигурирование путем вырезания и вставки из существующего.
Результат выглядел так:
Обратите внимание, что Db2Context все еще ссылается на DbContext1 в своих метаданных...<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>
У меня была та же проблема с получением исключения, когда я пытался добавить экземпляр моего класса в DbSet. Моя проблема заключалась в том, что определение таблицы в базе данных не соответствовало моему объекту acutal (2 ненулевых свойства отсутствовали в моей модели). Я добавил Эти два свойства в свой класс, и ошибка исчезла.