Значение не может быть нулевым. Имя параметра: entitySet
У меня довольно стандартная установка с просто классами POCO
public class Project
{
public int ProjectId { get; set; }
public string Name { get; set; }
public int? ClientId { get; set; }
public virtual Client Clients { get; set; }
}
Они используют интерфейс
public interface IProjectRepository
{
IEnumerable<Project> Projects { get; }
}
и построены в качестве хранилища для привязанного к
public class EFProjectRepository : IProjectRepository
{
private EFDbContext context = new EFDbContext();
public IEnumerable<Project> Projects
{
get { return context.Projects; }
}
}
Фактический контекст - это просто DbContext
public class EFDbContext : DbContext
{
public DbSet<Project> Projects { get; set; }
}
Когда я пытаюсь включить код для первой миграции, я получаю следующую ошибку
Я сделал этот точный процесс с другими проектами, и там никогда не было ошибки. Это соединение с локальной базой данных Sql Server. Кажется, нет проблемы со строкой подключения. Я искал эту ошибку в Интернете, но решения, кажется, отвечают на вопросы, которые не имеют прямого отношения к моей настройке.
8 ответов
Эта проблема может возникнуть, если один из классов POCO не был объявлен в DbContext.
Я добавил их, и ошибка ушла
Я изменил имя Task
Класс POCO из-за его связи со встроенным именем.NET System.Threading.Tasks
, Однако я не изменил это в POCO "TaskTimeLog", где была связь. При прохождении кода свойство "Task" в POCO "TaskTimeLog" не показывало ошибку, потому что теперь оно было присоединено к этому ключевому слову потока, и причина, по которой я сменил имя в первую очередь.
У меня была та же проблема, и причиной был класс POCO, который имел свойство типа Type
,
Поздно к игре... но если это поможет...
У меня была такая же проблема, все работало нормально, но эта проблема появилась, я добавил следующее в один из моих классов
public HttpPostedFileBase File { get; set; }
который, казалось, сломал это.
Я гарантировал, что не сопоставил это с базой данных, используя следующее:
[NotMapped]
public HttpPostedFileBase File { get; set; }
Вам необходимо добавить следующее выражение using:
using System.ComponentModel.DataAnnotations.Schema;
Надеюсь это поможет
У меня такая ошибка:
Значение не может быть нулевым. Имя параметра: entitySet
Оказывается, я пытался объединить данные из двух разных DbContexts.
var roles = await _identityDbContext.Roles
.AsNoTracking()
.Take(1000)
.Join(_configurationDbContext.Clients.ToList(),
a => a.ClientId,
b => b.Id,
(a,b) => new {Role = a, Client = b})
.OrderBy(x => x.Role.ClientId).ThenBy(x => x.Role.Name)
.Select(x => new RoleViewModel
{
Id = x.Role.Id,
Name = x.Role.Name,
ClientId = x.Role.ClientId,
ClientName = x.Client.ClientName
})
.ToListAsync();
Исправление заключается в добавлении ToList
как показано. Тогда соединение будет происходить в коде, а не в базе данных.
Делайте это только в том случае, если у вас все в порядке с получением всей таблицы. (Я знаю, что моя таблица "Клиенты" всегда будет относительно небольшой.)
Для тех, кто не нашел разрешения в других ответах, я получил эту ошибку, когда создал производный класс из класса, у которого был экземпляр в некоторой модели. Исключение произошло при первом использовании моего контекста в запросе.
Это урезанный пример, который будет воспроизводить поведение. Модель - это DbSet в моем контексте.
public class Model
{
public int Id { get; set; }
public Duration ExposureDuration { get; set; }
}
public class Duration
{
public int Value { get; set; }
public string Unit { get; set; }
}
//Adding this will cause the exception to occur.
public class DurationExtended : Duration
{ }
Это произошло во время незавершенного производства. Когда я изменил свойство модели ExposureDuration на тип DurationExtended, все снова заработало.
У меня была та же проблема, и потребовалось много времени, чтобы найти решение. В нашем случае мы создали отдельный проект для обработки сущностей, и даже если проект по умолчанию в консоли диспетчера пакетов был тем, который обрабатывал сущности, мне нужно установить этот проект в качестве проекта по умолчанию, чтобы он работал.
Я надеюсь, что это поможет кому-то еще.
Для кого-то еще это может быть полезно, у меня было свойство TimeZone (фактический объект.NET TimeZone), и это дало мне ту же ошибку, не знаю почему, но копаю глубже:)
Я столкнулся с этой же проблемой и решил так:
Ошибка в классе модели:
public class UserInformation
{
public string ID { get; set; }
public string AccountUserName { get; set; }
public HttpPostedFileBase ProfilePic { get; set; }
}
Нет ошибок в классе модели
public class UserInformation
{
public string ID { get; set; }
public string AccountUserName { get; set; }
public string ProfilePicName { get; set; }
}
Моя проблема была решена, как только я обновил ProfilePic
тип недвижимости от HttpPostedFileBase
в string
, Если у вас есть свойство, которое не относится к типу string
, int
, double
или некоторый другой базовый / стандартный тип либо заменяет такое свойство, либо обновляет его до типа, который SQL с большей вероятностью примет.
Удалить строку <Generator>EntityModelCodeGenerator</Generator>
из вашего файла проекта.
Проверьте это https://www.c-sharpcorner.com/UploadFile/5d065a/poco-classes-in-entity-framework/
У меня есть некоторые свойства в "ExpenseModel", один из которых был...
public virtual Type TypeId {get; set;}
который был причиной вышеупомянутой ошибки из-за свойства "Type" typeType, поэтому я изменил
"Type" => "ExpenseType", и это сработало...:-)
public virtual ExpenseType TypeId {get; set;}
ExpenseModel.cs
public class ExpenseTypes
{
[Key]
public int Id { get; set; }
public string TypeName { get; set; }
public string Description { get; set; }
}
В моем случае мне пришлось ссылаться на другой класс модели под названием IanaTimeZone, но вместо
public virtual IanaTimeZone Timezone { get; set; }
не торопясь, я набрал это:
public virtual TimeZone Timezone { get; set; }
и он скомпилировался нормально, потому что VS думал, что это System.TimeZone, но EF6 выдавал ошибку. Глупая вещь, но мне потребовалось время, чтобы разобраться, так что, может быть, это кому-то поможет.
Я получил эту ошибку, когда объявил переменную типа Type - вероятно, потому что это сложный тип, не поддерживаемый БД.
Когда я изменил его на строку, ошибка исчезла
public class Sample
{
public int SampleID {get;set;}
public Type TypeInfo {get; set;} //This caused the error,
//because Type is not directly convertible
//in to a SQL datatype
}