2012-09-12 22 views
5

Estoy construyendo sitio web ASP MVC utilizando Entity Framework 4.4 con .NET Framework 4.0Marco de la entidad muchos a muchos de migración de base de datos

He añadir a mi modelo de una relación de muchos a muchos, así:

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

Cuando corro Add-Migration comando consigo esta clase de migración (I eliminar el método de 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. ¿Por qué los nombres de campo para TenantID y UserID son User_UserID y Tenant_TenantID y no UserID y TenantID, respectivamente?

  2. ¿Cómo puedo cambiar el andamio de migración predeterminado (o mi modelo) para hacer que cascadeDelete sea falso? (actualmente simplemente lo cambio a mano).

Respuesta

4

Puede quitar la eliminación en cascada convención de esta manera:

using System.Data.Entity.ModelConfiguration.Conventions; 

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

y luego ver si los cambios de andamios. Yo personalmente nunca lo he usado.

Además, Microsoft (tipo de) explica las convenciones de nomenclatura FK en este link bajo el encabezado Foreign Keys.

+0

Gracias, eso responde la segunda pregunta. –

+0

¿Qué claridad buscabas en tu primera pregunta? En el enlace provisto se explica que la prioridad se da a '' al decidir los nombres de FK. –

+0

esta convención de nombres ocurre solo en muchos a muchos. Cuando asigno uno a muchos obtuve el nombre de campo EntityID sin el nombre de propiedad de navegación –

7

Puede crear su tabla de mapeo de la forma que desee con notación fluida. En su clase de DbContext, anular el OnModelCreating con esto:

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

Además, el uso fluido, si quieres desactivar el borrado en cascada en tablas individuales, se puede utilizar el .WillCascadeDelete (falso) para hacer el mapa propiedades. Aquí hay un gran post on MSDN sobre cómo usar notaciones fluidas.

+0

Gracias, todavía no estoy seguro de lo inteligente que es mezclar primero las convenciones de código con llamadas fluidas, pero seguro que parece el camino a seguir hasta que Microsoft permitirá agregar diferentes convenciones y no solo eliminarlas –

Cuestiones relacionadas