問題描述 :
數據庫中有兩張表,如下:

Member(會員)表有外鍵RoleId,對應的是Role(角色)表的主鍵Id,業務邏輯是Member表的RoleId必須與Role表的Id對應(但在設計數據表時沒有設置外鍵,使用EF(Entity Framework,下同)來配置)
首頁Member的代碼如下:
public partial class Member { public int Id { get; set; } public string Name { get; set; } public string Password { get; set; } public bool Delete{ get; set; } public int RoleId { get; set; } public virtual Role Role { get; set; } }
Role表的代碼如下:
public partial class Role { public int Id { get; set; } public string Name { get; set; } public virtual IList<Member> Members { get; set; } }
Member、Role的關系代碼如下:
public class MemberMap : EntityTypeConfiguration<Member> { public MemberMap() { this.ToTable("Member"); this.HasKey(m => m.Id); this.HasRequired(m => m.Role).WithMany().HasForeignKey(m => m.RoleId); } }
public class RoleMap: EntityTypeConfiguration<Role> { public RoleMap() { this.ToTable("Role"); this.HasKey(r => r.Id); } }
EF操作類如下:
public partial class EFContext<T> : DbContext where T : class { public EFContext(): base("name=MyConnectionString") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { Database.SetInitializer<EFContext<T>> (null); modelBuilder.Configurations.Add(new MemberMap()); modelBuilder.Configurations.Add(new RoleMap()); base.OnModelCreating(modelBuilder); } public DbSet<T> Table { get; set; } public IQueryable<T> GetList(Expression<Func<T,bool>> where) { return this.Table.Where(where); } }
程序運行時提示異常,

展開詳情信息如下:

使用SQL Profiler發現生成的代碼如下:

這里多查詢了Role_Id,實際RoleId已經是外鍵了。
解決方法是WithMany()配置映射,即修改MemberMap為如下:
public class MemberMap : EntityTypeConfiguration<Member> { public MemberMap() { this.ToTable("Member"); this.HasKey(m => m.Id); this.HasRequired(m => m.Role).WithMany(r => r.Members).HasForeignKey(m => m.RoleId); } }
此時再運行控制台程序,沒有異常,SQL Profiler如下:

可能有人會問,如果確實在MemberMap中使用WithMany()而不是WithMany(r=>r.Members)呢?
此時修改方式如下:
注釋或刪除Role實體代碼中的Members屬性
public partial class Role { public int Id { get; set; } public string Name { get; set; } //public virtual IList<Member> Members { get; set; } }
修改MemberMap為上面所述的:
public class MemberMap : EntityTypeConfiguration<Member> { public MemberMap() { this.ToTable("Member"); this.HasKey(m => m.Id); this.HasRequired(m => m.Role).WithMany().HasForeignKey(m => m.RoleId); } }
最后重新運行程序,沒有異常


