Проблема с миграцией один ко многим в EF

товарищи, имеется такая проблема. В Entity Framework были описаны модели так:

public class User
{
    public List<UserInfo> UserInfos { get; set; }
}

public class UserInfo
{
}

В базе создалась правильная запись для связи один-ко-многим спустя несколько миграций понадобилось сделать в классе UserInfo обратную связь и его дописали так:

public class UserInfo
{
    public User User { get; set; }
}

Ссылка нам говорит, что при такой форме EF должен распознать связь и все должно быть хорошо, только добавленная миграция генерирует лишнее поле:

        AddColumn("dbo.UserInfoes", "User_Id1", c => c.Int());
        CreateIndex("dbo.UserInfoes", "User_Id1");
        AddForeignKey("dbo.UserInfoes", "User_Id1", "dbo.Users", "Id");

и в базе данных в таблице UserInfo, кроме поля User_Id добавилось поле User_Id1, а должна быть только одна ссылка. Подскажите, как решить данную проблему?

P.S. была попытка решить двумя миграциями: 1-удалить связь совсем, 2-накатить необходимое изменение, но выдает тот-же результат. Пробовал писать - public virtual User User { get; set; } - не помогает.


Ответы (1 шт):

Автор решения: A K

Вы не показываете классы полностью, а мне интересно посмотреть как вы объявили ключи.

Вангую что первичный ключ в UserInfo был объявлен как public int UserId { get; set; }.

Если вы объявите ключ просто как Id, то ошибки не будет:

public class User
{
    public int Id { get; set; }

    public string Title { get; set; }

    public List<UserInfo> UserInfos { get; set; }
}

public class UserInfo
{
    public int Id { get; set; }

    public User User { get; set; }
}

Пруф:

введите сюда описание изображения

Вот вам второй вариант, тоже по конвенции правильный:

public class User
{
    public int UserId { get; set; }

    public string Title { get; set; }

    public List<UserInfo> UserInfos { get; set; }
}

public class UserInfo
{
    public int UserInfoId { get; set; }

    public User User { get; set; }
}

Пруф:

введите сюда описание изображения

Оба варианта валидны согласно конвенциям, у меня в личных предпочтениях первый, но в общем-то без разницы.

А вот чем ваш вариант ошибочен — тем, что поле UserId на UserInof расценивается как первичный ключ, но для связи один-ко-многим нужна ещё одна связь, поэтому в базе и создаётся User_Id1

В том числе и поэтому я раньше всегда предлагал выписывать все ключи явно, на что мне указывал Павел Майоров, что мол EF сообразит и достроит сам всё нужное по конвенции. Но для этого нужен опыт, а иначе можно попасть в такие вот ситуации как у вас в вопросе.

→ Ссылка