Проблема с миграцией один ко многим в 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 шт):
Вы не показываете классы полностью, а мне интересно посмотреть как вы объявили ключи.
Вангую что первичный ключ в 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 сообразит и достроит сам всё нужное по конвенции. Но для этого нужен опыт, а иначе можно попасть в такие вот ситуации как у вас в вопросе.

