0

この状況を表すモデルを取得する方法を、最初にコードを使用するか、最初に db を使用して理解しようとしています。エンティティ フレームワーク 5.0 を使用しています。

単一のアカウントが関連付けられている場合と、関連付けられていない場合があるユーザーがいます。それらがアカウントに関連している場合、多くの役割があります。

基本的に、私は必要です:

ユーザー ==> 0,1 UserAccount 1 ==> * UserAccountRole * <== 1 AccountRole

UserAccount テーブルには UserID の一意のキーが必要です UserAccount テーブルには UserID,AccountID の主キーがあります UserAccountRole には UserID,AccountID,AccountRoleId の主キーがあります

DB First を使用すると、モデルは 1=>0,1 を取得しません。最初のコードでは、これを表す Fluent API の方法を理解できません。

ここに画像の説明を入力

これを行うことはできますか、それともビジネス ルールが 1 つだけの多対多のユーザー アカウント テーブルが必要ですか?

ありがとう

4

2 に答える 2

1

わかりました、答えが見つかりました。少し複雑なので、気に入るかどうかわかりません。

上記のテーブル構造を取得するには、SystemUserAccount を多対多として作成する必要があります。次に、SystemUserAccount テーブルの UserId 列に別の一意のキーを作成する必要があります。これを実行するために見つけた唯一のフックは、DBInitializer の Seed メソッドでした。コードは次のとおりです。

public  class SystemUser
{
  public int Id { get; set; }
  public string Name { get; set; } 

  public ICollection<SystemUserAccount> SystemUserAccounts{get;set;}
}

 public class Account
{
   public int Id { get; set; }
   public ICollection<SystemUserAccount> SystemUserAccount { get; set; }
}

public class SystemUserAccount
{
    public int UserId { get; set; }
    public int AccountId { get; set; }

    public virtual ICollection<AccountRole> AccountRoles { get; set; }

    public SystemUser SystemUser { get; set; }
    public Account UserAccount { get; set; }
}

public class AccountRole
{
    public int Id { get; set; }
    public String Name { get; set; }

    public virtual ICollection<SystemUserAccount> UserAccounts { get; set; }
}

次に、このコンテキスト:

 public DbSet<SystemUser> SystemUser { get; set; }
    public DbSet<SystemUserAccount> SystemUserAccount { get; set; }
    public DbSet<Account> Account { get; set; }
    public DbSet<AccountRole> AccountRole { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<SystemUserAccount>()
            .HasKey(sua => new { sua.UserId, sua.AccountId });

        modelBuilder.Entity<SystemUserAccount>()
            .HasRequired(sua => sua.SystemUser)
            .WithMany(u => u.SystemUserAccounts)
            .HasForeignKey(u => u.UserId);

        modelBuilder.Entity<SystemUserAccount>()
            .HasMany(sua => sua.AccountRoles)
            .WithMany(ar => ar.UserAccounts)
            .Map(m =>
                     {
                         m.ToTable("UserAccountRole");
                         m.MapLeftKey("UserId", "AccountId");
                         m.MapRightKey("AccountRoleId");
                     }
            );
    }

最後に、データベース初期化子のシード メソッドで:

public  class DatabaseInitializer : DropCreateDatabaseAlways<PeopleContext>
{
  protected override void Seed(PeopleContext context)
  {
        context.Database.ExecuteSqlCommand("ALTER TABLE SystemUserAccounts ADD CONSTRAINT uc_User UNIQUE(UserId)"); 
  }
}

次に、プログラムで DatabaseInitializer を呼び出します。

  Database.SetInitializer<PeopleContext>(new DatabaseInitializer());

これにより、OPに示されているテーブル構造が得られます。クエリでどのように動作するかはまだわかりません。

これをやろうとしている人に役立つことを願っています。

タル

于 2012-08-20T13:31:47.177 に答える
0

あなたが何をしようとしているのかよくわかりませんが、あなたが望んでいるのは 3 つの主要なクラスだとUser思いUserAccountますAccountRole。あなたの目標を誤解している場合は、質問をより具体的に更新してください。

もしそうなら、私はこれらのクラスでこれを達成しました:

public class User
{
    public int UserId { get; set; }
    public virtual UserAccount UserAccount { get; set; }
}

public class UserAccount
{
    public int UserId { get; set; }
    public int AccountId { get; set; }
    public virtual ICollection<AccountRole> AccountRoles { get; set; }

    public virtual User User { get; set; }

}

public class AccountRole
{
    public int AccountRoleId { get; set; }
    public virtual ICollection<UserAccount> UserAccounts { get; set; }
}

そしてこのマッピング:

public class Model : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<UserAccount> UserAccounts { get; set; }
    public DbSet<AccountRole> AccountRoles { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .HasOptional(u => u.UserAccount)
            .WithRequired(ua => ua.User);

        modelBuilder.Entity<UserAccount>()
            .HasKey(k => new {k.AccountId, k.UserId});

        modelBuilder.Entity<UserAccount>()
            .HasMany(ua => ua.AccountRoles)
            .WithMany(ar => ar.UserAccounts)
            .Map(map =>
                {
                    map.ToTable("UserAccountRole");
                    map.MapLeftKey("UserId", "AccountId");
                    map.MapRightKey("AccountRoleId");
                });

    }
}

これにより、クラスと、探している複合キーを持つ多対多テーブルが作成されました。

ここに画像の説明を入力

于 2012-08-17T17:44:51.770 に答える