Невозможно определить основной конец ассоциации - Сначала модель Framework Entity Framework
Я создал модель данных Entity в Visual Studio. Теперь у меня есть файл с SQL-запросами и классами С#, сгенерированными из Model.
Вопрос:
Классы генерируются без аннотаций или кода (Fluent API). Это нормально? Я попытался запустить мое приложение, но было исключено исключение:
Невозможно определить главный конец связи между типами "Runnection.Models.Address" и "Runnection.Models.User". Основной конец этой ассоциации должен быть явно сконфигурирован с использованием либо свободного API API, либо аннотаций данных.
Я читал, что я не могу использовать Fluent API с "Model First". Так что я могу сделать?
Код:
Пользователь
public partial class User
{
public User()
{
this.Events = new HashSet<Event>();
this.CreatedEvents = new HashSet<Event>();
}
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Photo { get; set; }
public int EventId { get; set; }
public string Nickname { get; set; }
public OwnerType OwnerType { get; set; }
public NetworkPlaceType PlaceType { get; set; }
public virtual ICollection<Event> Events { get; set; }
public virtual Address Address { get; set; }
public virtual ICollection<Event> CreatedEvents { get; set; }
public virtual Owner Owner { get; set; }
}
Адрес
public partial class Address
{
public int Id { get; set; }
public string Street { get; set; }
public string StreetNumber { get; set; }
public string City { get; set; }
public string ZipCode { get; set; }
public string Country { get; set; }
public virtual User User { get; set; }
}
Контекст
//Модель First не использует этот метод
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Address>().HasRequired(address => address.User)
.WithRequiredDependent();
modelBuilder.Entity<User>().HasRequired(user => user.Address)
.WithRequiredPrincipal();
base.OnModelCreating(modelBuilder);
}
Ответы
Ответ 1
Вы должны указать принципала в отношениях "один к одному".
public partial class Address
{
[Key, ForeignKey("User")]
public int Id { get; set; }
public string Street { get; set; }
public string StreetNumber { get; set; }
public string City { get; set; }
public string ZipCode { get; set; }
public string Country { get; set; }
public virtual User User { get; set; }
}
Указывая ограничение FK, EF знает, что пользователь должен существовать сначала (основной) и Адрес следует.
Дальнейшее чтение в MSDN.
Также см. этот ответ SO.
Обновлено из комментариев
В дизайнере выберите ассоциацию (строка между пользователями и адресом). В окне свойств нажмите кнопку [...] по ссылочному ограничению (или дважды щелкните по строке). Установите Принципала как Пользователь.
Ответ 2
Ошибка:
Имела ту же ошибку: "Не удалось определить главный конец ассоциации между типами" Providence.Common.Data.Batch "и" Providence.Common.Data.Batch ". Основной конец этой ассоциации должен быть явно сконфигурирован с использованием либо свободно распространяемые API или аннотации данных".
ОДНАКО, обратите внимание, что это ТАБЛИЦА.
Причина. Моя база данных была MS SQL Server. К сожалению, когда MS SQL Server Management Studio добавляет внешние ключи, он добавляет внешний ключ по умолчанию в качестве столбца Batch ID таблицы Batch, ссылаясь на себя. Вы, как разработчик, должны выбрать другую таблицу и идентификатор для поистине внешнего ключа, но если вы этого не сделаете, это позволит разрешить запись саморегуляции FK.
Решение: Решение заключалось в удалении FK по умолчанию.
Причина 2: Другая ситуация заключается в том, что текущая таблица может быть исправлена, но старый исторический образ таблицы, когда EF edmx был выполнен, имел FK по умолчанию.
Решение 2: удалить таблицу из списка типов типов браузера модели и нажать "да", а затем снова "Обновить модель из базы данных".