#sql-server #entity-framework-core #ef-database-first #.net-core-2.1
#sql-server #entity-framework-core #ef-database-first #.net-core-2.1
Вопрос:
У меня есть библиотека классов .NET Core 2.1, которая использует Microsoft.Сначала база данных EntityFrameworkCore. Я смог заставить его создавать модели из базы данных, но каждый раз, когда я пытаюсь прочитать из базы данных, я получаю ошибку. В таблице, которую я считываю, нет идентификаторов Guid и внешних ключей. Класс имеет int в качестве первичного ключа. Итак, я не уверен, что вызывает эту проблему. Буду признателен за любую помощь.
Примечание: Пользователь SQL настроен с доступом только для чтения. Мне не нужно создавать, обновлять или удалять записи.
Я следовал приведенным здесь инструкциям:
https://www.entityframeworktutorial.net/efcore/create-model-for-existin&-database-in-ef-core.aspx
ОШИБКА:
Свойство ‘Guid’ не может быть настроено как ‘ValueGeneratedOnUpdate’ или ‘ValueGeneratedOnAddOrUpdate’, поскольку значение ключа не может быть изменено после добавления объекта в хранилище.
ТРАССИРОВКА СТЕКА:
в Microsoft.EntityFrameworkCore.Инфраструктура.ModelValidator.Проверьте изменяемые ключи (модель IModel, регистратор IDia&nosticsLo&&er
1 lo&&er) at Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.Validate(IModel model, IDia&nosticsLo&&er
1) в Microsoft.EntityFrameworkCore.Инфраструктура.RelationalModelValidator.Проверка (IModel model, IDia&nosticsLo&&er1 lo&&er) at Microsoft.EntityFrameworkCore.SqlServer.Internal.SqlServerModelValidator.Validate(IModel model, IDia&nosticsLo&&er
1 lo&&er) в Microsoft.EntityFrameworkCore.Метаданные.Соглашения.Внутреннее.ConventionDispatcher.ImmediateConventionScope.OnModelFinalized(IConventionModelBuilder ModelBuilder) в Microsoft.EntityFrameworkCore.Метаданные.Внутреннее.Модель.FinalizeModel() в Microsoft.EntityFrameworkCore.Инфраструктура.ModelSource.&etModel(контекст DbContext, IConventionSetBuilder conventionSetBuilder) в Microsoft.EntityFrameworkCore.Внутреннее.DbContextServices.CreateModel() в Microsoft.EntityFrameworkCore.Внутреннее.DbContextServices.&et_Model()
в Microsoft.Расширения.DependencyInjection.ServiceLookup.Вызываетiteruntimeresolver.VisitFactory(FactoryCallSite factoryCallSite, контекст RuntimeResolverContext) в Microsoft.Расширения.DependencyInjection.ServiceLookup.Вызывает sitevisitor2.VisitCallSiteMain(ServiceCallSite callSite, TAr&ument ar&ument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEn&ineScope serviceProviderEn&ine, RuntimeResolverLock lockType) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite sin&letonCallSite, RuntimeResolverContext context) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor
2.VisitCallSite(ServiceCallSite callSite, аргумент TAr&ument) в Microsoft.Расширения.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, контекст RuntimeResolverContext) в Microsoft.Расширения.DependencyInjection.ServiceLookup.CallSiteVisitor2.VisitCallSiteMain(ServiceCallSite callSite, TAr&ument ar&ument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEn&ineScope serviceProviderEn&ine, RuntimeResolverLock lockType) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite sin&letonCallSite, RuntimeResolverContext context) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor
2.VisitCallSite(ServiceCallSite callSite, аргумент TAr&ument) в Microsoft.Расширения.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, область ServiceProviderEn&ineScope) в Microsoft.Расширения.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(поставщик услуг IServiceProvider, тип ServiceType) в Microsoft.Расширения.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T] (поставщик услуг IServiceProvider) в Microsoft.EntityFrameworkCore.DbContext.&et_DbContextDependencies()
в Microsoft.EntityFrameworkCore.DbContext.&et_InternalServiceProvider() в Microsoft.EntityFrameworkCore.DbContext.&et_DbContextDependencies() в Microsoft.EntityFrameworkCore.DbContext.&et_Model() в Microsoft.EntityFrameworkCore.Внутреннее.InternalDbSet1.&et_EntityType() at Microsoft.EntityFrameworkCore.Internal.InternalDbSet
1.&et_EntityQueryable() в Microsoft.EntityFrameworkCore.Внутреннее.Внутренний набор1.System.Linq.IQueryable.&et_Provider() at System.Linq.Queryable.Where[TSource](IQueryable
1 источник, выражение`1 предикат) в Live_Db.LiveDbHelper.GetAllClients() в D:VSProjectsDashboardLive_DbLiveDbHelper.cs:line 18
DbContext:
public partial class ApplicationContext : DbContext
{
public ApplicationContext(DbContextOptions<ApplicationContext&&t; options)
: base(options)
{ }
protected override void OnConfi&urin&(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfi&ured)
{
optionsBuilder.UseSqlServer("Server=****; Database=****; User Id=****; Password=****");
}
}
public virtual DbSet<Client&&t; Client { &et; set; }
protected override void OnModelCreatin&(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Client&&t;(entity =&&t;
{
entity.ToTable("Client", "app");
entity.HasIndex(e =&&t; e.ClientIdpublic)
.HasName("IX_ctbl.sys.Client_PublicIDKey")
.IsUnique();
entity.Property(e =&&t; e.ClientId).HasColumnName("ClientID");
entity.Property(e =&&t; e.Billin&Address1).HasMaxLen&th(200);
entity.Property(e =&&t; e.Billin&Address2).HasMaxLen&th(200);
entity.Property(e =&&t; e.Billin&City).HasMaxLen&th(200);
entity.Property(e =&&t; e.Billin&ContactName).HasMaxLen&th(200);
entity.Property(e =&&t; e.Billin&Country).HasMaxLen&th(200);
entity.Property(e =&&t; e.Billin&Email)
.HasMaxLen&th(200)
.IsUnicode(false);
entity.Property(e =&&t; e.Billin&PhoneNumber).HasMaxLen&th(25);
entity.Property(e =&&t; e.Billin&ReferenceId)
.HasColumnName("Billin&ReferenceID")
.HasMaxLen&th(50)
.IsUnicode(false);
entity.Property(e =&&t; e.Billin&State).HasMaxLen&th(200);
entity.Property(e =&&t; e.Billin&StatusCode)
.HasMaxLen&th(20)
.IsUnicode(false);
entity.Property(e =&&t; e.Billin&Zip).HasMaxLen&th(200);
entity.Property(e =&&t; e.ClientIdpublic)
.IsRequired()
.HasColumnName("ClientIDPublic")
.HasMaxLen&th(15)
.IsUnicode(false);
entity.Property(e =&&t; e.ClientName)
.IsRequired()
.HasMaxLen&th(100);
entity.Property(e =&&t; e.ClientSecret).HasMaxLen&th(300);
entity.Property(e =&&t; e.DefaultAuthTypeId).HasColumnName("DefaultAuthTypeID");
entity.Property(e =&&t; e.EvalEndDate).HasColumnType("datetime");
entity.Property(e =&&t; e.Ftppwd)
.HasColumnName("FTPPwd")
.HasMaxLen&th(50)
.IsUnicode(false);
entity.Property(e =&&t; e.InactiveMessa&e)
.HasMaxLen&th(200)
.IsUnicode(false);
entity.Property(e =&&t; e.Lo&LocalDbcalls).HasColumnName("Lo&LocalDBCalls");
entity.Property(e =&&t; e.RenewalDate).HasColumnType("datetime");
entity.Property(e =&&t; e.TokenForAutoNtauth)
.IsRequired()
.HasColumnName("TokenForAutoNTAuth")
.HasMaxLen&th(50)
.IsUnicode(false);
});
}
Метод чтения:
public static List<Client&&t; GetAllClients()
{
try
{
List<Client&&t; clients = new List<Client&&t;();
usin& (var db = new ApplicationContext())
{
clients = db.Client.ToList();
}
return clients;
}
catch (Exception e)
{
throw;
}
}
Комментарии:
1. И вы на 100% уверены, что база данных, с которой вы выполняете, является той, для которой вы создали модель?
2. Спасибо @ErikEJ. Yes. это точно такая же строка подключения, пользователь и пароль. Я использовал метод ‘обратного проектирования’ с помощью команды ‘Scaffold-DbContext’. Как вы думаете, есть ли параметр, который я должен был использовать, который я, возможно, пропустил? Я дал ему только минимум для создания каркаса базы данных.
3. Это не ответ, но в итоге я получил сообщение об ошибке для остановки. Когда я создавал каркас базы данных, EFC извлек все таблицы, которых оказалось около 180, которые я не использовал. Я закомментировал весь код, который не был связан с моей задачей, и ошибка исчезла. Итак, я все еще не знаю, в чем заключалась реальная проблема, но я думаю, что Guid по крайней мере в одной из этих таблиц, вероятно, является источником. Я вернусь к этому позже, когда у меня будет время, и опубликую правильный ответ, как только смогу сузить круг поиска.
4. EF Core power tools имеет графический интерфейс для выбора (запоминания) таблиц