Идентификатор AspNetUsers как внешний ключ в отдельной таблице, отношения "один-к-одному" - программирование
Подтвердить что ты не робот

Идентификатор AspNetUsers как внешний ключ в отдельной таблице, отношения "один-к-одному"

Я посмотрел вверх и вниз, попробовал все различные и различные способы хранения внешнего ключа таблицы AspNetUser в отдельной таблице Customer. Я все еще новичок в ASP.NET и Entity Framework, но я прочитал немало сообщений и документации.

В настоящее время это то, что у меня есть

Модели

public class Customer
{
    [Display (Name="Customer ID")]
    public int CustomerID { get; set; }

    public string UserId { get; set; }
    [ForeignKey("UserId")]
    public virtual ApplicationUser ApplicationUser { get; set; }

}


 public class ApplicationUser : IdentityUser
{
    public virtual Customer Customer { get; set; }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public DbSet<Customer> Customers { get; set; }

    public ApplicationDbContext()
        : base("DefaultConnection")
    {
    }

}

Я получаю эту ошибку, цитирую

Невозможно определить главный конец ассоциации между типами TestApplication.Models.Customer 'и' TestApplication.Models.ApplicationUser '. Основной конец этой ассоциации должен быть явно сконфигурирован с использованием либо свободного API API, либо аннотаций данных.

Я также попробовал этот метод person, найденный здесь: Основной конец этой ассоциации должен быть явно сконфигурирован с использованием свободно распространяемого API или аннотаций данных

Итак, я прокомментировал аннотации ForeignKey и использовал предложение человека, используя подход "modelBuilder". И когда я обновил свою базу данных, "Id" из таблицы AspNetUsers был в таблице Customers (это хорошо), но CustomerID как ForeignKey также был в таблице AspNetUsers, чего я не хочу.

Я хочу, чтобы идентификатор AspNetUsers находился в таблице Customers как ForeignKey.

4b9b3361

Ответ 1

В взаимно однозначном отношении таблица "child" в вашем случае Customer должна иметь тот же первичный ключ, что и связанная таблица, то есть внешний ключ.

Выбранный образец кода означает, что в Customer у вас будет ПК с именем CustomerID, который отличается от UserId.

Это должно работать в вашем случае (непроверено):

public class Customer
{
    [Key]
    public string UserId { get; set; }

    [ForeignKey("UserId")]
    public virtual ApplicationUser ApplicationUser { get; set; }
}

public class ApplicationUser : IdentityUser
{
    public virtual Customer Customer { get; set; }
}

Edit:

MSDN для ForeignKeyAttribute:

Если вы добавите атрибут ForeigKey к свойству внешнего ключа, вы следует указать имя связанного свойства навигации. если ты добавьте атрибут ForeigKey в свойство навигации, вы должны укажите имя связанного внешнего ключа (ов).

Я интерпретирую это как то, что должно быть возможно добавить атрибут ForeignKey как в свойство навигации, так и в свойство внешнего ключа, и что любой из них должен работать, но, по-видимому, нет. Перемещение его, как показано ниже, должно сделать трюк.

public class Customer
{
    [Key, ForeignKey("ApplicationUser")]
    public string UserId { get; set; }
    public virtual ApplicationUser ApplicationUser { get; set; }
}

public class ApplicationUser : IdentityUser
{
    public virtual Customer Customer { get; set; }
}

Ответ 2

Я знаю, что этому сообщению 2 года, но лучшим решением было бы использовать Fluent API для установки внешнего ключа (вместо использования атрибута [ForeignKey] в вашем классе Customer. Вот как вы это сделаете:

public class Customer
{
    public int CustomerID { get; set; }
    public virtual ApplicationUser ApplicationUser { get; set; }
}

public class ApplicationUser : IdentityUser
{
    public virtual Customer Customer { get; set; }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext() : base("DefaultConnection")
    {
    }

    public DbSet<Customer> Customers { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        // one-to-zero or one relationship between ApplicationUser and Customer
        // UserId column in Customers table will be foreign key
        modelBuilder.Entity<ApplicationUser>()
            .HasOptional(m => m.Customer)
            .WithRequired(m => m.ApplicationUser)
            .Map(p => p.MapKey("UserId"));
    }

}

Это создаст столбец UserId в таблице Customers, который является внешним ключом в таблице AspNetUsers. Вы можете опустить .Map(p => p.MayKey("UserId")), и EF будет указывать внешний ключ ApplicationUser_Id по соглашению.