Подтвердить что ты не робот

Невозможно определить основной конец ассоциации - Сначала модель 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);
    }
4b9b3361

Ответ 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: удалить таблицу из списка типов типов браузера модели и нажать "да", а затем снова "Обновить модель из базы данных".