2010-12-10 11 views
6

Tengo una base de datos predefinida que quiero asignar usando Entity Framework 4 CodeFirst.Especificación del nombre de una columna en Entity Framework para un objeto referenciado

public class Site 
{ 
    public int SiteId { get; set; } 
    public string SiteName { get; set; } 
    public DateTime InstallDate { get; set; } 
    public string Phase { get; set; } 
    public string Address { get; set; } 
    public string GpsPosition { get; set; } 
    public string NetworkDetail { get; set; } 
    public string SiteCode { get; set; } 
    public string UserGroupCode { get; set; } 
    public string InfrastructureNumber { get; set; } 
    public string Province { get; set; } 

    public virtual ICollection<LcuSetting> LcuSettings { get; set; } 
} 

Y otra clase

public class LcuSetting 
{ 
    public int LCUSettingId { get; set; } 
    [Column(Name="Site_Id")] 
    public Site Site { get; set; } 


    public string Name { get; set; } 
    public string IPAddress { get; set; } 
    public string SubnetMask { get; set; } 
    public string DefaultGateway { get; set; } 
} 

Debido a las convenciones de asignación de EF4 que está buscando una columna SiteSiteId en los LCUSettings de mesa, que no se puede encontrar, ya que la columna es en realidad el nombre Site_ID

En mi clase derivada DbContext, anulo el método OnModelCreating y configuro los nombres de las tablas para usar.

modelBuilder.Entity<Site>().ToTable("Site"); 

esto funciona bien.

Cuando intento para especificar el nombre de la columna sin embargo, de la siguiente manera

modelBuilder.Entity<LcuSetting>().Property(c => c.Site).HasColumnName("Site_Id"); 

recibo el siguiente mensaje de excepción

El tipo 'LcuSystemOnline.Models.Site' debe ser un no anulable tipo de valor para usarlo como parámetro 'T' en el tipo genérico o método 'System.Data.Entity.ModelConfiguration.Configuration.Types.StructuralTypeConfiguration.Property (System.Linq.Expressions.Expression>)'

entiendo la excepción, pero ¿cómo puedo obtener la forma en la modelBuilder para asignar un ColumnName específica a la Site

Respuesta

7

En CTP5, no se puede utilizar la columna de atributos para especificar el nombre de clave externa que creamos. En su lugar, tiene que hacerlo de esta manera con la API de fluidez:

public class Category 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public ICollection<Product> Products { get; set; } 
} 

public class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public Category Category { get; set; } 
} 

public class MyContext : DbContext 
{ 
    public DbSet<Product> Products { get; set; } 
    public DbSet<Category> Categories { get; set; } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Product>() 
      .HasRequired(p => p.Category) 
      .WithMany(c => c.Products) 
      .IsIndependent() 
      .Map(mc => mc.MapKey(c => c.Id, "CategoryId")); 
    } 
} 

Nota a la llamada "Map" en el método OnModelCreating. Esto es algo que muchas personas se han topado y me gusta la idea de utilizar ColumnAttribute para ayudar con el nombre.

Se puede ver este artículo de blog que escribí para más detalles: http://blogs.msdn.com/b/adonet/archive/2010/12/10/code-first-mapping-changes-in-ctp5.aspx

Cuestiones relacionadas