【问题标题】:Many-to-many relationship with POCO classes in Entity Framework (DB first)实体框架中与 POCO 类的多对多关系(DB 优先)
【发布时间】:2013-01-16 12:52:17
【问题描述】:

我的上下文如下所示:

public DbSet<User> Users { get; set; }
public DbSet<AccessGroup> AccessGroups { get; set; }
public DbSet<UserAccessGroup> UsersAccessGroups { get; set; }

数据库有三个表:

  • 用户 [Pk = Id, ...]
  • AccessGroups [Pk = Id, ...]
  • UsersAccessGroups [Pk = Id, Fk = UserId, Fk = AccessGroupId, ...](还有创建者和创建时间的列)

我们有三个班级:

public class User
{
  public virtual int Id { get; set; }
  public virtual ICollection<UserAccessGroup> UsersAccessGroups { get; set; }
  // Some more..
}

public class AccessGroup
{
  public virtual int Id { get; set; }
  public virtual ICollection<UserAccessGroup> UsersAccessGroups { get; set; }
  // Some more..
}

[Table("UsersAccessGroups")]
public class UserAccessGroup
{
  public virtual int Id { get; set; }
  public virtual int UserId { get; set; }
  public virtual int AccessGroupId { get; set; }
  public virtual int CreatedByUserId { get; set; }
  public virtual DateTime CreatedAt { get; set; }

  public virtual User User { get; set; }
  public virtual AccessGroup AccessGroup { get; set; }
  public virtual User CreatedByUser { get; set; }
}

我希望能够使用这样的用户对象:

var user = Context.Users.Select(x => x);
var accessGroup = user.UsersAccessGroups.Select(x => x.AccessGroup).ToList();

但是第二行不起作用。我收到错误消息“无效的列名 User_Id” 当我有一对一的关系(如 CreatedByUser)时,相同的代码可以工作。

我也试过这样的:

Context.Users.Include("UsersAccessGroups")
  .Include("UsersAccessGroups.AccessGroup")
  .Include("UsersAccessGroups.User").Select(...);

但我遇到了同样的问题。

是否有可能让它工作,或者我必须以某种方式改变它?

【问题讨论】:

    标签: entity-framework many-to-many poco


    【解决方案1】:

    您需要为 CreatedByUser 指定外键,因为 EF 无法按照约定映射它。

    [Table("UsersAccessGroups")]
    public class UserAccessGroup
    {
      public virtual int Id { get; set; }
      public virtual int UserId { get; set; }
      public virtual int AccessGroupId { get; set; }
      public virtual int CreatedByUserId { get; set; }
      public virtual DateTime CreatedAt { get; set; }
    
      public virtual User User { get; set; }
      public virtual AccessGroup AccessGroup { get; set; }
      [ForeignKey("CreatedByUserId")]
      public virtual User CreatedByUser { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 2013-03-14
      • 2011-08-16
      • 2013-03-17
      相关资源
      最近更新 更多