2013-07-04 12 views
0

У меня есть две таблицы, называемые пользователя и UserSession, есть два соотношения между этими двумя таблицами:Code First Invalid Column Name SecondaryUser_Id

UserSession.User -> User.UserSession

UserSession.SecondaryUser -> User.UserSessions

Пользователь UserSession всегда будет иметь пользователя, но может не иметь SecondaryUser.

Я пытаюсь сопоставить эти отношения с помощью кода Первый Свободный, ниже мои текущие отображения и определения классов:

UserSessionMap:

 public UserSessionMap() 
    { 
     // Primary Key 
     this.HasKey(t => t.UserId); 

     // Properties 
     this.Property(t => t.UserId) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

     // Table & Column Mappings 
     this.ToTable("UserSession"); 
     this.Property(t => t.UserId).HasColumnName("UserId"); 
     this.Property(t => t.SecondaryUserId).HasColumnName("SecondaryUserId"); 
     this.Property(t => t.RoleNameCompanyInfo).HasColumnName("RoleNameCompanyInfo"); 
     this.Property(t => t.RecordCreate).HasColumnName("RecordCreate"); 
     this.Property(t => t.RecordUpdate).HasColumnName("RecordUpdate"); 

     // Relationships 
     this.HasRequired(t => t.User).WithRequiredPrincipal(p => p.UserSession); 
     this.HasOptional(t => t.SecondaryUser).WithMany(p => p.UserSessions).HasForeignKey(p=>p.SecondaryUserId); 

    } 

Пользователь Карта:

public class UserMap : EntityTypeConfiguration<User> 
{ 
    public UserMap() 
    { 
     // Primary Key 
     this.HasKey(t => t.Id); 

     // Properties 
     ...snip... 

     // Table & Column Mappings 
     this.ToTable("User"); 
     this.Property(t => t.Id).HasColumnName("Id"); 
     ...snip... 
    } 
} 

Пользовательский субъект:

public partial class UserSession 
{ 
    public int UserId { get; set; } 
    [ForeignKey("SecondaryUser")] 
    public int? SecondaryUserId { get; set; } 
    public string RoleNameCompanyInfo { get; set; } 
    public DateTime RecordCreate { get; set; } 
    public DateTime RecordUpdate { get; set; } 

    public virtual User User { get; set; } 

    public virtual User SecondaryUser { get; set; } 
} 

объект пользователя:

public partial class User 
{ 
    public User() 
    { 
     this.Carts = new List<Cart>(); 
     this.DirectDispenses = new List<DirectDispense>(); 
     this.Downloads = new List<Download>(); 
     this.MatchQuestionSessions = new List<MatchQuestionSession>(); 
     this.Orders = new List<Order>(); 
     this.UserSessions = new List<UserSession>(); 
     this.UserUserRoles = new List<UserUserRole>(); 
    } 

    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int CompanyId { get; set; } 
    public string Email { get; set; } 
    public string Password { get; set; } 
    public string PasswordSalt { get; set; } 
    public string Role { get; set; } 
    public bool Active { get; set; } 
    public string ColibriUserId { get; set; } 
    public Nullable<int> DispenserId { get; set; } 
    public Nullable<System.Guid> PasswordResetCode { get; set; } 
    public Nullable<System.DateTime> PasswordResetSent { get; set; } 
    public System.DateTime RecordUpdate { get; set; } 
    public System.DateTime RecordCreate { get; set; } 
    public virtual ICollection<Cart> Carts { get; set; } 
    public virtual Company Company { get; set; } 
    public virtual ICollection<DirectDispense> DirectDispenses { get; set; } 
    public virtual ICollection<Download> Downloads { get; set; } 
    public virtual ICollection<MatchQuestionSession> MatchQuestionSessions { get; set; } 
    public virtual ICollection<Order> Orders { get; set; } 
    public virtual ICollection<UserSession> UserSessions { get; set; } 
    public virtual UserSession UserSession { get; set; } 
    public virtual ICollection<UserUserRole> UserUserRoles { get; set; } 
} 

Я также попытался добавить [ForeignKey ("SecondaryUserId") в собственность SecondaryUser без удачи.

Как правило, свойства UserId и SecondaryUserId должны отображаться в свойстве Id для пользователя. Ошибка EF генерируется:

System.Data.SqlClient.SqlException: Неверное имя столбца «SecondaryUser_Id».

Что я думаю, что делает это, ищет свойство SecondaryUser_Id в таблице User, которого, очевидно, нет. Как я могу сказать, чтобы посмотреть свойство Id на объекте User. Все статьи, которые я нашел, показывают, как сопоставить ПК с FK, которые не называются так, как ожидает EF, похоже, это случай противоположности, для которого я не могу найти примеров.

Похоже, что с такой же ошибкой на SO возникли подобные проблемы, но ни одно из этих решений не сработало для меня, и эта ситуация выглядит по-другому (как я уже сказал, это похоже на противоположность наиболее распространенным причина этой ошибки).

ответ

2

Проведя день, безумно глядя на это и даже дойдя до полного удаления свойства вторичного пользователя, я все еще получал ту же проблему. Запуск нового проекта дал мне решение.

В проекте есть частичный класс пользователя, обладающий свойством SecondaryUser, который по существу является прокси-сервером для свойства SecondaryUser в UserSession, именно это свойство EF пыталось сопоставить.

Я добавил атрибут [NotMapped] к этому свойству, и эта ошибка исчезла.

Урок выученный - проверьте свои частичные!