Когда вы устанавливаете внешний ключ как это
[ForeignKey("ReferenceDictionaryCategory,ReferenceDictionaryId")]
public virtual ReferenceDictionary ReferenceDictionary { get; set; }
и после попытки загрузить данные, как показано ниже,
var test = await _dbcontext.FooEntities.Include(x => x.ReferenceDictionary).ToListAsync();
Это будет преобразовано в sql, как показано ниже,
SELECT [x].[Id],
[x].[ReferenceDictionaryCategory],
[x].[ReferenceDictionaryId],
[x.ReferenceDictionary].[Category],
[x.ReferenceDictionary].[Id]
FROM [FooEntity] AS [x]
LEFT JOIN [ReferenceDictionary] AS [x.ReferenceDictionary]
ON ([x].[ReferenceDictionaryCategory] = [x.ReferenceDictionary].[Category])
AND ([x].[ReferenceDictionaryId] = [x.ReferenceDictionary].[Id])
Вот почему вы получаете [ReferenceDictionaryCategory]
не столбец. Это не дает никакого эффекта, добавляя [NotMapped]
, потому что это не место для вызова столбца.
Обходной путь, вы можете написать запрос, как показано ниже. (Если вы не хотите добавлять столбец ReferenceDictionaryCategory
к FooEntity
)
var result = from fe in _dbcontext.FooEntities
join rd in _dbcontext.ReferenceDictionaries
on new { Category = "FooCategory", fe.Id } equals new { rd.Category, rd.Id } into data
from final in data.DefaultIfEmpty()
select new FooEntity
{
Id = fe.Id,
ReferenceDictionaryId = fe.ReferenceDictionaryId,
ReferenceDictionary = final
};
Это сгенерирует sql следующим образом.
SELECT [rd].[Category], [rd].[Id], [fe].[Id] AS [Id0], [fe].[ReferenceDictionaryId]
FROM [FooEntity] AS [fe]
LEFT JOIN [ReferenceDictionary] AS [rd] ON (N'FooCategory' = [rd].[Category]) AND ([fe].[Id] = [rd].[