我有两个名为User和UserSession的表,这两个表之间有两个关系:
UserSession.User - > User.UserSession
UserSession.SecondaryUser - > User.UserSessions
UserSession将始终拥有一个用户,但可能没有SecondaryUser。
我正在尝试使用Code First Fluent映射这些关系,下面是我当前的映射和类定义:
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...
}
}
UserSession实体:
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属性都应该映射到User的Id属性。 EF产生的错误是:
System.Data.SqlClient.SqlException:无效的列名称'SecondaryUser_Id'。
我认为它正在做的是在User表上寻找一个名为SecondaryUser_Id的属性,显然不存在。如何告诉它查看User对象上的Id属性。我发现的所有文章都展示了如何将PK映射到未命名为EF期望的FK,这似乎是一个相反的情况,我没有找到任何例子。
在SO上出现同样的错误似乎有很多类似的问题,但这些解决方案都没有对我有用,这种情况似乎有所不同(正如我所说,这似乎与最常见的原因相反)这个错误)。
答案 0 :(得分:2)
花了一天时间疯狂地看着这个,甚至完全删除了secondaryUser属性,我仍然遇到了同样的问题。开始一个新项目给了我解决方案。
在项目中有一个User的部分类,它具有一个SecondaryUser属性,它基本上是UserSession上的SecondaryUser属性的代理,EF正试图映射这个属性。
我将[NotMapped]属性添加到此属性,此错误已消失。
经验教训 - 检查你的部分内容!
答案 1 :(得分:0)
解决方案是在表中添加缺少的列。很简单。