2012-09-12 13 views
5

の多くは、私はそうのような多くの関係に私のモデルに多くを追加しました.NET Frameworkを使用して4.0Entity Frameworkの多くのデータベース移行

をEntity Frameworkの4.4を使用してASP MVCのWebサイトを構築しています:

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コマンドを実行すると

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

あなたは規則をこのようにカスケード削除を削除することができます

using System.Data.Entity.ModelConfiguration.Conventions; 

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

をそして足場の変更かどうかを確認します。私は個人的にそれを使ったことはありません。

また、というヘッダのlinkにあるMicrosoftのFK命名規則について説明しています。

+0

ありがとう、それは2番目の質問に答える。 –

+0

あなたの最初の質問にはどんな明快さが求められましたか?提供されているリンクでは、FK名を決定するときに優先順位が '<ナビゲーションプロパティ名><プライマリキーのプロパティ名>'に与えられると説明しています。 –

+0

この命名規則は、多くの場合のみ発生します。私が1つを多数にマップすると、ナビゲーションプロパティ名なしでEntityIDフィールド名だけが得られます –

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"); 
       }); 
    } 

を、流暢な使用して、あなたは個々のテーブルの上にカスケード削除を無効にしたい場合は、プロパティをマッピングするときに、あなたが(偽).WillCascadeDeleteを使用することができます。流暢な表記の使い方については、post on MSDNをご覧ください。

+0

ありがとう、私はまだ流暢な呼び出しでコードの最初の慣習をミックスするのはどのように賢明かは分かりませんが、確かにMicrosoft別の規則を追加するだけでなく、削除することもできます –

関連する問題