5

EntityFramework4.4と.NETFramework4.0を使用してASPMVCWebサイトを構築しています

モデルに次のような多対多の関係を追加しました。

  public class User {
    public int UserID { get; set; }
    public string Username { get; set; }
    public virtual ICollection<Tenant> Tenants { get; set; }
  }


  public class Tenant {
    public string TenantID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<User> Users { get; set; }
  }

コマンドを実行するAdd-Migrationと、この移行クラスが取得されます(Downメソッドを削除します)

  public partial class TenantUsersManyToManyMigration : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "dbo.UserTenants",
                c => new
                    {
                        User_UserID = c.Int(nullable: false),
                        Tenant_TenantID = c.String(nullable: false, maxLength: 128),
                    })
                .PrimaryKey(t => new { t.User_UserID, t.Tenant_TenantID })
                .ForeignKey("dbo.Users", t => t.User_UserID, cascadeDelete: true)
                .ForeignKey("dbo.Tenants", t => t.Tenant_TenantID, cascadeDelete: true)
                .Index(t => t.User_UserID)
                .Index(t => t.Tenant_TenantID);
        }
  }
  1. TenantIDとUserIDのフィールド名がUser_UserIDとTenant_TenantIDであり、それぞれUserIDとTenantIDではないのはなぜですか。

  2. デフォルトの移行スキャフォールディング(またはモデル)を変更して、cascadeDeleteをfalseにするにはどうすればよいですか?(現在、私はそれを手で変更するだけです)。

4

2 に答える 2

7

流暢な表記法を使用して、希望する方法でマッピングテーブルを作成できます。DbContextクラスで、OnModelCreatingを次のようにオーバーライドします。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .HasMany(u => u.Tenants)
            .WithMany(t => t.Users)
            .Map(m =>
                {
                    m.ToTable("UserTenants");
                    m.MapLeftKey("UserId");
                    m.MapRightKey("TenantId");
                });
    }

また、fluentを使用して、個々のテーブルでカスケード削除を無効にする場合は、プロパティをマッピングするときに.WillCascadeDelete(false)を使用できます。流暢な表記法の使用方法に関するMSDNのすばらしい投稿があります。

于 2012-09-12T13:09:06.113 に答える
4

カスケード削除規則は、次の方法で削除できます。

using System.Data.Entity.ModelConfiguration.Conventions;

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
}

そして、足場が変わるかどうかを確認します。個人的には使ったことがありません。

また、Microsoft(一種)は、このリンクのヘッダーの下にあるFKの命名規則について説明していForeign Keysます。

于 2012-09-12T12:23:44.523 に答える