Spécification du nom d'une colonne dans Entity Framework pour un objet référencé

.net c# entity-framework

Question

Je souhaite mapper une base de données prédéfinie à l'aide de Entity Framework 4 CodeFirst.

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

Et une autre classe

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

En raison des conventions de mappage de EF4, il recherche une colonne SiteSiteId dans la table LCUSettings, impossible à trouver car la colonne est en réalité nommée Site_ID

Dans ma classe dérivée DbContext , je substitue la méthode OnModelCreating et définit les noms de tables à utiliser.

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

cela fonctionne bien.

Lorsque j'essaie de spécifier le nom de la colonne, comme suit

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

Je reçois le message d'exception suivant

Le type 'LcuSystemOnline.Models.Site' doit être un type valeur non nullable pour pouvoir l'utiliser comme paramètre 'T' dans le type ou la méthode générique 'System.Data.Entity.ModelConfiguration.Configuration.Types.StructuralTypeConfiguration.Property ( System.Linq.Expressions.Expression>) '

Je comprends l'exception, mais comment puis-je obtenir que modelBuilder attribue un modelBuilder de modelBuilder spécifique au Site

Réponse acceptée

Dans CTP5, vous ne pouvez pas utiliser l'attribut Column pour spécifier le nom de la clé étrangère que nous créons. Vous devez plutôt le faire de cette manière avec l'API fluide:

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

Notez l'appel à "Map" dans la méthode OnModelCreating. C'est quelque chose que beaucoup de gens ont rencontré et j'aime bien l'idée d'utiliser l'attribut ColumnAttribute pour aider avec le nom.

Vous pouvez voir cet article de blog que j'ai écrit pour plus de détails: http://blogs.msdn.com/b/adonet/archive/2010/12/10/code-first-mapping-changes-in-ctp5.aspx



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow