0

私は次のようなコンテキストを持っています:

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

データベースには3つのテーブルがあります。

  • ユーザー[Pk=Id、...]
  • AccessGroups [Pk = Id、...]
  • UsersAccessGroups [Pk = Id、Fk = UserId、Fk = AccessGroupId、...](作成者と作成者の列もあります)

3つのクラスがあります。

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();

ただし、2行目は機能しません。「無効な列名User_Id」というエラーが表示されます。1対1の関係(CreatedByUserなど)がある場合も同じコードが機能します。

私もこのようなことを試しました:

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

しかし、私は同じ問題を抱えています。

これを機能させることは可能ですか、それともどういうわけか別の方法で行う必要がありますか?

4

1 に答える 1

0

EF は規則によってそれをマップできないため、CreatedByUser の外部キーを指定する必要があります。

[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; }
}
于 2013-01-16T15:16:20.867 に答える