Как настроить нетрадиционные отношения внешнего ключа?

1

Я использую EF 6.1.1 Code First против существующей схемы, которую я не могу изменить. У меня есть отношения от одного до многих между Visit и VisitActivityLog.

public class Visit
{
    public Guid VisitKey { get; set; }
    public ICollection<VisitActivityLog> VisitActivityLogs { get; set; }
}

public class VisitActivityLog
{
    public Guid LogKey { get; set; }
    public Guid VisitKey { get; set; }
    public Visit Visit { get; set; }
}

public class VisitConfiguration : EntityTypeConfiguration<Visit>
{
    public VisitConfiguration()
    {
        ToTable("Visits");
        HasKey(visit => visit.VisitKey);
    }
}

public class VisitActivityLogConfiruration : EntityTypeConfiguration<VisitActivityLog>
{
    public VisitActivityLogConfiruration()
    {
        ToTable("VisitsActivityLog");
        HasKey(log => log.LogKey);
        HasRequired(log => log.Visit).WithMany().HasForeignKey(log => log.VisitKey);
    }
}

Когда я пытаюсь выполнить запросы, я получаю следующее исключение:

SqlException: Invalid column name 'Visit_VisitKey'.Invalid column name 'Visit_VisitKey'.

Это сгенерированный SQL:

SELECT 
    [Project2].[C1] AS [C1], 
    [Project2].[VisitKey] AS [VisitKey], 
    [Project2].[C2] AS [C2], 
    [Project2].[LogKey] AS [LogKey], 
    [Project2].[VisitKey1] AS [VisitKey1], 
    [Project2].[Visit_VisitKey] AS [Visit_VisitKey]
    FROM ( SELECT 
        [Limit1].[VisitKey] AS [VisitKey], 
        [Limit1].[C1] AS [C1], 
        [Extent2].[LogKey] AS [LogKey], 
        [Extent2].[VisitKey] AS [VisitKey1], 
        [Extent2].[Visit_VisitKey] AS [Visit_VisitKey], 
        CASE WHEN ([Extent2].[LogKey] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C2]
        FROM   (SELECT TOP (100) 
            [Extent1].[VisitKey] AS [VisitKey], 
            1 AS [C1]
            FROM [dbo].[Visits] AS [Extent1] ) AS [Limit1]
        LEFT OUTER JOIN [dbo].[VisitsActivityLog] AS [Extent2] ON [Limit1].[VisitKey] = [Extent2].[Visit_VisitKey]
    )  AS [Project2]
    ORDER BY [Project2].[VisitKey] ASC, [Project2].[C2] ASC

Если я VisitActivityLogs свойство VisitActivityLogs из Visit, я могу запросить VisitActivityLog и найти связанный с ним Visit.

Я прочитал эти документы Microsoft 1, 2, но я не могу правильно настроить EF.

  • 0
    Зачем вам нужен public Guid VisitKey { get; set; } в VisitActivityLog когда вы можете получить к нему доступ через ссылку Visit ?
  • 0
    Это FK в таблице VisitActivityLog . Я включил его в модель, чтобы я мог использовать метод конфигурации .HasForeignKey() . Я также попытался удалить его из модели и использовать .Map(m => m.MapKey("VisitKey")) , но это тоже не сработало.
Показать ещё 1 комментарий
Теги:
entity-framework
entity-framework-6
ef-code-first

1 ответ

1
Лучший ответ

У нас была аналогичная проблема. Мы решили это с использованием метода.Map(). Предполагая, что ваш внешний ключ называется "VisitKey" и после нескольких экспериментов я получил следующий код. Единственное отличие заключается в том, что VisitKey удаляется из VisitActivityLog а внешняя конфигурация ключа переместилась в VisitConfiguration

public class Visit
{
    public Guid VisitKey { get; set; }
    public ICollection<VisitActivityLog> VisitActivityLogs { get; set; }
}

public class VisitActivityLog
{
    public Guid LogKey { get; set; }
    public Visit Visit { get; set; }
}

public class VisitConfiguration : EntityTypeConfiguration<Visit>
{
    public VisitConfiguration()
    {
        ToTable("Visits");
        HasKey(visit => visit.VisitKey);
        HasMany(visit => visit.VisitActivityLogs)
            .WithRequired(v => v.Visit)
            .Map(m => m.MapKey("VisitKey"))
            .WillCascadeOnDelete(false);
    }
}

public class VisitActivityLogConfiruration : EntityTypeConfiguration<VisitActivityLog>
{
    public VisitActivityLogConfiruration()
    {
        ToTable("VisitsActivityLog");
        HasKey(log => log.LogKey);
    }
}
  • 0
    спасибо - отлично работает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню