2012-09-12 11 views
5

buduję strony internetowej ASP MVC przy użyciu Entity Framework 4.4 z .NET Framework 4.0Entity Framework wiele do wielu migracji bazy

mam dodać do mojego modelu wiele do wielu relacji tak:

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

Kiedy biegnę Add-Migration komendy otrzymuję tę klasę migracji (I usunąć metodę dół)

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. Dlaczego nazwy pól TenantID i UserID to User_UserID i Tenant_TenantID, a nie UserID i TenantID, odpowiednio.

  2. Jak zmienić domyślne rusztowanie migracji (lub mój model), aby cascadeDelete było fałszywe? (obecnie po prostu zmieniam go ręcznie).

Odpowiedz

4

Można usunąć kaskada usuwać Niniejsza konwencja sposób:

using System.Data.Entity.ModelConfiguration.Conventions; 

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

a następnie sprawdzić, czy zmiany rusztowań. Osobiście nigdy tego nie używałem.

Również Microsoft (rodzaj) wyjaśnia konwencje nazewnictwa FK w tym link pod nagłówkiem Foreign Keys.

+0

Dziękuję, że odpowiedź na drugie pytanie. –

+0

Jaką jasność miałeś na pierwszym pytaniu? W podanym linku wyjaśniono, że przy podejmowaniu decyzji o nazwach FK pierwszeństwo ma "". –

+0

ta konwencja nazewnictwa ma miejsce tylko dla wielu osób. Kiedy mapuję jeden do wielu, dostaję tylko nazwę pola EntityID bez nazwy właściwości nawigacji –

7

Możesz utworzyć swoją tablicę map tak, jak chcesz, używając płynnej notacji. W swojej klasie DbContext, nadpisać OnModelCreating z tym:

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

także za pomocą płynnie, jeśli chcesz wyłączyć kaskadowe usuwanie na poszczególnych stołach, można użyć .WillCascadeDelete (fałszywe) podczas mapowania właściwości. Oto świetny post on MSDN, w jaki sposób korzystać z płynnych notacji.

+0

Dziękuję, nie jestem jeszcze pewien, jak inteligentnie jest mieszać pierwsze konwencje kodu z płynnymi połączeniami, ale z pewnością wygląda na to, jak do Microsoftu pozwoli dodawać różne konwencje, a nie tylko je usuwać –

Powiązane problemy