У меня есть составной ключ в таблице, который не является таблицей соединения, потому что он содержит другое поле, свойство 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.
Спасибо, Рис
Измените ключи от полей к свойствам. Также вы должны пометить свойства навигации с атрибутами 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; }
Это создаст следующую таблицу:
ПРИМЕЧАНИЕ. Я предлагаю вам использовать свободный 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);
}