Я использую 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.
У нас была аналогичная проблема. Мы решили это с использованием метода.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);
}
}
public Guid VisitKey { get; set; }
вVisitActivityLog
когда вы можете получить к нему доступ через ссылкуVisit
?VisitActivityLog
. Я включил его в модель, чтобы я мог использовать метод конфигурации.HasForeignKey()
. Я также попытался удалить его из модели и использовать.Map(m => m.MapKey("VisitKey"))
, но это тоже не сработало.