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 с удостоверением, встроенным в базу данных.

Надеюсь, это поможет любому, кто сбит с толку.

Другие вопросы по тегам