C# - недопустимая таблица ссылок на внешние ключи - базовая миграция не работает
Пытаюсь сделать мой первый проект на C#. Тем не менее, это очень расстраивает пока. Это проблема, которую я не могу решить, так как не вижу в этом ничего плохого.
Я пытаюсь просто выполнить миграцию в моей БД.
Файл миграции пользователей
public override void Up()
{
CreateTable(
"dbo.Users",
c => new
{
user_id = c.Int(nullable: false, identity: true),
first_name = c.String(),
last_name = c.String(),
email = c.String(),
role = c.String(),
})
.PrimaryKey(t => t.user_id);
}
Файл миграции местоположений
public override void Up()
{
CreateTable(
"dbo.Locations",
c => new
{
loc_id = c.Int(nullable: false, identity: true),
loc_name = c.String(),
})
.PrimaryKey(t => t.loc_id);
CreateTable(
"dbo.UserLoc",
c => new
{
ul_id = c.Int(nullable: false, identity: true),
fk_user_id = c.Int(nullable: false),
fk_loc_id = c.Int(nullable: false),
})
.PrimaryKey(t => t.ul_id);
AddForeignKey("dbo.UserLoc", "fk_user_id", "dbo.Users", "user_id");
AddForeignKey("dbo.UserLoc", "fk_loc_id", "dbo.Locations", "loc_id");
}
Модели:
User.cs
public class User
{
[Key]
public int user_id { get; set; }
public string firs_tname { get; set; }
public string last_name { get; set; }
public string email { get; set; }
public string role { get; set; }
}
Location.cs
public class Locations
{
[Key]
public int loc_id { get; set; }
public int loc_name { get; set; }
}
UserLoc.cs
public class UserLoc
{
[Key]
public int ul_id { get; set; }
[ForeignKey("Users")]
public int fk_user_id { get; set; }
public virtual User user { get; set; }
[ForeignKey("Locations")]
public int fk_location_id { get; set; }
public virtual Locations location { get; set; }
}
Каждый раз, когда я хочу мигрировать, я получаю ту же ошибку
Внешний ключ 'FK_dbo.UserLoc_dbo.Users_fk_user_id' ссылается на недопустимую таблицу 'dbo.Users'. Не удалось создать ограничение или индекс. Смотрите предыдущие ошибки.
Что я делаю неправильно?
2 ответа
Сначала я рекомендую вам изменить имя FK, которое вы используете в ForeignKey
атрибуты для имен свойств навигации:
public class UserLoc
{
[Key]
public int ul_id { get; set; }
[ForeignKey("user")]
public int fk_user_id { get; set; }
public virtual User user { get; set; }
[ForeignKey("location")]
public int fk_location_id { get; set; }
public virtual Locations location { get; set; }
}
Таким образом, вы сообщаете ему, какое свойство навигации представляет отношение, для которого он является внешним ключом.
После этого удалите старую миграцию и попробуйте снова запустить Add-Migration
Команда, чтобы восстановить его. Теперь вы должны увидеть, что CreateIndex
метод вызывается раньше AddForeignKey
метод:
CreateIndex("dbo.UserLoc", "fk_user_id");
AddForeignKey("dbo.UserLoc", "fk_user_id", "dbo.Users", "user_id");
CreateIndex("dbo.UserLoc", "fk_loc_id");
AddForeignKey("dbo.UserLoc", "fk_loc_id", "dbo.Locations", "loc_id");
У меня недавно была эта проблема.
Я удалил все миграции, несколько раз запустил remove-migration, чтобы очистить некоторые миграции идентификаторов ASP.Net по умолчанию, а затем воссоздал миграции с нуля.
Ядро Entity Framework сбивало стандартные леса класса IdentityUser с моей пользовательской реализацией, поэтому он не смог найти таблицу ASPNetUsers, когда я приступил к созданию связанной с ним таблицы, в данном случае «Рефералы».
Обязательно удалите все миграции по умолчанию и запустите remove-migration при использовании EF Core с удостоверением, встроенным в базу данных.
Надеюсь, это поможет любому, кто сбит с толку.