2

Entity Framework 4.3 code first既存のデータベースを使用しています。

Users table次の列を持つ があります。

- UserID (int)
- FirstName (string)
- Surname (string)

という関連テーブルがありますImpersonations。Impersonations テーブルは、ユーザー テーブルと同じユーザー テーブル間の関連付けテーブルです。ユーザーは、ユーザーのリストを持つことができます。Impersonations table構造は次のとおりです。

- ImpersonateID (int primary key)
- UserID (int FK to Users table's UserID column)
- ImpersonatedUserID (int FK to Users table's UserID column)

これらの列にマップするプロパティを持つ User クラスがあります。

public class User : IEntity
{
     public int Id { get; set; }
     public string FirstName { get; set; }
     public string LastName { get; set; }
     public string EmployeeNumber { get; set; }
     public virtual ICollection<User> ImpersonatedUsers { get; set; }
     public virtual ICollection<User> Users { get; set; }
}

私のdbコンテキストクラスには、次のものがあります。

public DbSet<User> Users { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     modelBuilder.Configurations.Add(new UserConfiguration());
}

ユーザー構成:

class UserConfiguration : EntityTypeConfiguration<User>
{
     internal UserConfiguration()
     {
          this.Property(x => x.Id).HasColumnName("UserID");
          this.Property(x => x.LastName).HasColumnName("Surname");
          this.Property(x => x.EmployeeNumber).HasColumnName("StaffNumber");

          this.HasMany(i => i.Users)
               .WithMany(c => c.ImpersonatedUsers)
               .Map(mc =>
               {
                    mc.MapLeftKey("UserID");
                    mc.MapRightKey("ImpersonatedUserID");
                    mc.ToTable("Impersonations");
               });
     }
}

Entity Framework を使用してこれを正しくリンクしましたか? ユーザー ID を渡すと、なりすましユーザーとしてマークされたユーザーのリストを返す必要があります。どうすればいいですか?私はこれを持っていますが、 User と ImpersonatedUsers の両方が空です:

return DbContext.Users
     .Include("ImpersonatedUsers")
     .SingleOrDefault(x => x.Id == userId);

Users テーブルに次のデータがあるとします (ID、名、姓、従業員番号)。

7 Craig Matthews 123456
8 Susan Renshaw 234567
9 Michelle du Toit 34567

そして、偽装テーブルの次のデータ (偽装 ID、ユーザー ID、偽装ユーザー ID):

1 7 8
2 7 9

したがって、ユーザー ID 7 を渡すと、ユーザー Susan Renshaw と Michelle du Toit のレコードを返す必要があります。

まだ混乱している場合は、わかりやすくするために...

私も似たような状況です。製品テーブルと仕様テーブルがあります。これら 2 つは、ProductSpecifications と呼ばれる関連付けテーブルによってリンクされています。ここで同じことを達成しようとしていますが、2 つのテーブルはユーザー テーブルであり、関連テーブルは偽装です。

4

3 に答える 3

0

ユーザーはグループでもあるため、メンバーを持つことができます。

これが私のコードの抜粋です:

public partial class User : AuthorizableBaseObject, IHasUID {
    public User() {
        Members = new List<User>();
    }

    public Guid UID { get; set; }
    public DateTime EmailValidationDate { get; set; }

    public String EMail { get; set; }

    //public Int64 Id { get; set; }
    public String Login { get; set; }
    public String Password { get; set; }
    public String Description { get; set; }
    public DateTime LastConnectionDate { get; set; }

    public Boolean CanConnect { get; set; }
    public Boolean IsDisabled { get; set; }

    public virtual List<User> Members { get; set; }
}

次の構成で:

public class UserConfiguration : EntityTypeConfiguration<VDE.User> {
    public UserConfiguration()
        : base() {
        ToTable("Users", "dbo");

        Property(u => u.EMail).IsRequired().HasColumnType("nvarchar").HasMaxLength(100);
        Property(u => u.Login).IsRequired().HasColumnType("nvarchar").HasMaxLength(20);
        Property(u => u.Password).IsRequired().HasColumnType("nvarchar").HasMaxLength(50);
        Property(u => u.Description).HasColumnType("nvarchar").HasMaxLength(200);
        Property(u => u.LastConnectionDate).HasColumnType("datetime2");

        HasMany(u => u.Members).WithMany().Map(m => m.MapLeftKey("UserId").MapRightKey("MemberId").ToTable("UserMembers"));
    }
}

ここから、グループのメンバーを取得するクエリは簡単です。

context.Users.Where(u => u.Id == someId).Select(u => u.Members).FirstOrDefault()

これにより、IEnumerableが得られます

于 2012-07-05T13:07:52.760 に答える
0

継承に関するこのページを見てみてください。あなたの説明は素晴らしいものではありませんが、これがあなたが達成しようとしていることだと思います。

于 2012-07-03T12:52:35.773 に答える
0

偽装用のクラスを作成し、それを DBSet として dbcontext に追加する必要があります。EF では、[Column(Order = 0 or 1)] と共に [Key] 属性を外部キー フィールドに配置する必要があります。

次に、プロパティを遅延ロードできます。

    public virtual List<Impersonation> UserImpersonations
    {
        get
        {
            if(_userImpersonations == null)
            {
            // Set _userImpersonations = 
            // lazy load using a linq to sql query where 
            // UserImpersonations.UserId = this.UserId
            }

            return __userImpersonations;
        }
    }
于 2012-07-03T13:41:31.817 に答える