У меня есть отношение USER - PROFILE, где пользователь может (необязательно) иметь связанный профиль.В базе данных таблица PROFILES имеет FK для таблицы USERS (FK обнуляется).
Я хочу настроить это с помощью EF fluent API.Мне удалось это сделать, и все работает нормально, но проблема в том, что я не могу получить FK из профиля в качестве свойства в классах.
Так что в БД у меня есть:
[USERS]
ID uniqueidentifier PK not null
[PROFILES]
ID uniqueidentifier PK not null
USERID uniqueidentifer FK null
И в коде у меня есть:
public class User { public virtual Profile { get; set; } }
public class Profile { public virtual User { get; set; } }
Обратите внимание, что имена столбцов в БД не соответствуют соглашению об именовании EF.
Я могу настроить EF следующим образом:
HasOptional(u => u.Profile).WithRequired(p => p.User).Map(m => m.MapKey("USERID")).WillCascadeOnDelete();
или наоборот:
HasRequired(p => p.User).WithOptional(u => u.Profile).Map(m => m.MapKey("USERID")).WillCascadeOnDelete();
Мне действительно нужно в этом случае отобразить FK с помощью MapKey (из-за соглашения об именах, которое использует EF), и, похоже, это проблемане позволю мне добавить FK в модель.
Так что я не могу иметь:
public class Profile { public virtual User { get; set; } public Guid? UsreId { get; set; } }
У кого-нибудь есть идеи, как мне это сделать?
РЕДАКТИРОВАТЬ Источником проблемы является тот факт, что если я не использую метод .Map (m => m.MapKey ("USERID")), соглашение нарушает отношения (он ожидает, что FK равен User_Id), чтов основном это как использовать его без каких-либо параметров.Если я использую метод .Map (m => m.MapKey ("USERID")), то он говорит, что у меня уже есть UserId в качестве свойства в модели (из встроенной справки: настройка отношения для использования свойства внешнего ключа)что не представлены в объектной модели . Столбцы и таблицу можно настроить, указав действие конфигурации. Если указано пустое действие конфигурации, будут сгенерированы имена столбцов по соглашению ).
Облом ... ... 1034 *
РЕДАКТИРОВАТЬ 2 Удалось как-то это исправить (в основном для другого подхода).Изменили таблицы на:
[USERS]
ID uniqueidentifier PK not null
[PROFILES]
-- ID uniqueidentifier PK not null (removed the PK)
USERID uniqueidentifer PK not null, FK not null -- (the PK is also the FK)
Я попал сюда после запуска профилировщика SQL и просмотра запущенных там запросов.Опция PROFILE для каждого пользователя запрашивалась на основе USERID.Предложение were было примерно таким:
SELECT *
FROM PROFILES
WHERE ID = @userId -- ID was the PK
Итак, я выяснил, что в этом случае PK из таблицы PROFILES также должен быть FK, и сопоставления могут быть простыми:
HasOptional(u => u.Profile).WithRequired(p => p.User);
или на другом конце
HasRequired(p => p.User).WithOptional(u => u.Profile);
И этот был полезным: http://msdn.microsoft.com/en-us/library/hh295843%28v=vs.103%29.aspx
Ура!