Композитные ключи на столе с другими свойствами

1

У меня есть составной ключ в таблице, который не является таблицей соединения, потому что он содержит другое поле, свойство order.

У меня возникают проблемы со сложным ключом. Вот что выглядит:

public class User : BaseModel
{

    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }

    public virtual ICollection<UserQuestionGroup> QuestionGroups { get; set; }

    // ..... //
}

public class QuestionGroup
{
    public int Id { get; set; }
    public virtual ICollection<User> Users { get; set; }
    // ..... //
}

// This is where I'm having problems with the mapping
public class UserQuestionGroup
{        

    [Key,ForeignKey("User"), Column(Order = 0)]
    public int UserId;

    [Key, ForeignKey("QuestionGroupId"), Column(Order = 1)]
    public int QuestionGroupId;

    public virtual User User { get; set; }

    public virtual QuestionGroup QuestionGroup { get; set; }

    [Column("Sort")]
    public int Order { get; set; }
}

Это ошибка, которую я получаю:

One or more validation errors were detected during model generation:

Plus.DAL.UserQuestionGroup: : EntityType 'UserQuestionGroup' has no key defined. Define the key for this EntityType.
UserQuestionGroups: EntityType: EntitySet 'UserQuestionGroups' is based on type 'UserQuestionGroup' that has no keys defined.

У каждого пользователя может быть много групп вопросов, и у каждой группы вопросов может быть много пользователей. Я использую шаблон репозитория для доступа к уровню доступа к данным (DAL).

Может ли кто-нибудь указать мне в правильном направлении, либо с помощью Атрибутов, если это возможно, либо с помощью DbModelBuilder.

Я использую EF 6 с MVC 5.1.

Спасибо, Рис

Теги:
entity-framework
entity-framework-6
ef-code-first

1 ответ

2
Лучший ответ

Измените ключи от полей к свойствам. Также вы должны пометить свойства навигации с атрибутами ForeignKey, а не с ключами:

[Key, Column(Order = 0)]
public int UserId { get; set; }

[Key, Column(Order = 1)]
public int QuestionGroupId { get; set; }

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

[ForeignKey("QuestionGroupId")]
public virtual QuestionGroup QuestionGroup { get; set; }

Это создаст следующую таблицу:

Изображение 174551

ПРИМЕЧАНИЕ. Я предлагаю вам использовать свободный API сопоставления с кодом First - это позволит вашим сущностям очистить атрибуты, связанные с базой данных. То же отображение можно сделать следующим образом:

public class UserQuestionGroupMap : EntityTypeConfiguration<UserQuestionGroup>
{
    public UserQuestionGroupMapping()
    {
        HasKey(uqg => new { uqg.UserId, uqg.QuestionGroupId });
        Property(uqg => uqg.Order).HasColumnName("Sort");

        HasRequired(uqg => uqg.User)
            .WithMany(u => u.QuestionGroups).HasForeignKey(uqg => uqg.UserId);

        HasRequired(uqg => uqg.QuestionGroup)
            .WithMany().HasForeignKey(uqg => uqg.QuestionGroupId);
    }
}

Затем просто добавьте сопоставления к построителю модели при создании модели в вашем DbContext:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new UserQuestionGroupMap());
    // add other maps
    base.OnModelCreating(modelBuilder);
}
  • 0
    Спасибо тебе за это! Я не думал, что это работает, но я забыл изменить свои поля на свойства! Это делало мою голову, так что спасибо, куча!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню