Взаимно однозначное отношение ядра фреймворка

#c# #entity-framework #ef-code-first #asp.net-core #entity-framework-core

#c# #entity-framework #ef-code-first #asp.net-core #сущность-фреймворк-ядро

Вопрос:

У меня возникли проблемы с созданием простых взаимно однозначных отношений с использованием Entity Framework core. Сущности и переопределение метода OnModelCreating выглядят следующим образом:

     public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public BlogImage BlogImage { get; set; }
}

public class BlogImage
{
    public int BlogImageId { get; set; }
    public byte[] Image { get; set; }
    public string Caption { get; set; }

    public int BlogForeignKey { get; set; }
    public Blog Blog { get; set; }
}

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .HasOne(p => p.BlogImage)
            .WithOne(i => i.Blog)
            .HasForeignKey<BlogImage>(b => b.BlogForeignKey);
    }
  

Когда я передаю команду Update-Database, я получаю это сообщение об ошибке:

 Consider using the 'await' operator  to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread. 
 System.Data.SqlClient.SqlException: Incorrect syntax near the keyword 'WHERE'. 
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
    at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Booleanamp; dataReady) 
    at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite) 
    at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite, String methodName) 
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
    at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, String executeMethod, IReadOnlyDictionary`2 parameterValues, Boolean openConnection, Boolean closeConnection) 
    at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues, Boolean manageConnection) 
    at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands, IRelationalConnection connection) 
    at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
    at Microsoft.EntityFrameworkCore.Design.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.DatabaseUpdateCommand.<>c__DisplayClass0_0.<Configure>b__0() 
    at Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(String[] args)
    at Microsoft.EntityFrameworkCore.Tools.Cli.Program.Main(String[] args) 
ClientConnectionId:f21894a0-4ae6-4b73-95fc-40a7804cf9cb
 Error Number:156,State:1,Class:15
 Incorrect syntax near the keyword 'WHERE'. 
  

Что я должен проверить?
Спасибо!

Комментарии:

1. Модель в порядке. Не удается воспроизвести.

2. Спасибо, Иван Стоев, за попытку воспроизвести это.

Ответ №1:

Я думаю. Обычно потому, что в взаимно однозначных отношениях entity framework не может вывести внешний ключ и основные ключи.

Вы должны выразить их явно, чтобы обеспечить правильное создание внешнего ключа.

 modelBuilder.Entity<Blog>()
                .HasOne(parent => parent.BlogImage).WithOne(child => child.Blog)
                .HasPrincipalKey<Blog>(parent => parent.BlogId).HasForeignKey<BlogImage>(child => child.BlogForeignKey);
  

Ответ №2:

Спасибо, что пытались мне помочь. Похоже, проблема была связана с версией SQL Server. Я не знал, что EFCore несовместим с SQL Server 2005.

Спасибо! С наилучшими пожеланиями!