3

J'essaie d'utiliser l'API Entity Framework CTP5 Fluent pour mapper une base de données existante. J'ai les classes suivantes:Mappage de propriétés à des champs de clé étrangère (nommés différemment) dans Entity Framework CTP5

public class Shop 
{ 
    public long Id 
    { 
     get; 
     set; 
    } 
} 

public class Sale 
{ 
    public long Id 
    { 
     get; 
     set; 
    } 

    public virtual Shop Shop 
    { 
     get; 
     set; 
    } 
} 

Les tables correspondantes sont appelées "Magasins" et "Ventes". Sales a une clé étrangère StoreId qui pointe vers le champ Id dans la table Stores.

Je n'arrive pas à mapper le Sale.Shop.Id à StoreId dans la table. Je ne suis pas libre de le changer en ShopId, donc j'ai besoin de le mapper.

En CTP4, j'utilisais:

modelBuilder.Entity<Sale>().MapSingleType(x => 
    new 
    { 
     Id = x.Id, 
     StoreId = x.Shop.Id 
    }); 

J'ai essayé les éléments suivants:

modelBuilder.Entity<Sale>().Property(x => x.Shop.Id).HasColumnName("StoreId"); 

Cependant, il semble que ce ne fonctionne qu'avec un type primitif.

Comment spécifier ce mappage?

Répondre

2

Je pense que la meilleure façon de résoudre ce serait de mettre à niveau votre Association clé étrangère Association être un indépendant sens qu'au lieu de cacher la, y compris en fait la clé étrangère ShopId dans Sale classe. Ensuite, vous pouvez utiliser des données Aannotations/API Courant de changer son nom de colonne pour correspondre à votre schéma existant:

public class Shop 
{ 
    public long Id { get;set; } 
} 

public class Sale 
{ 
    public long Id { get; set; } 

    [Column(Name="StoreID")] 
    public long ShopId { get; set; } 

    public virtual Shop Shop { get; set; } 
} 


Quels sont les résultats du choix DB Schéma: alt text

0

Je pense que ce que vous cherchez est l'attribut RelatedTo. Plus d'informations dans this ADO.NET team blog post.

+1

L'attribut 'RelatedTo' est déclaré dans CTP4 et * est supprimé * dans CTP5. Donc ce n'est plus une option. Merci. –

9

Mise à jour: J'ai ajouté une version révisée de la version Release candidate de EF 4.1 ci-dessous

Après une chasse, je l'ai trouvé la réponse qui fonctionne pour moi:

EF4.1 RC versi sur:

modelBuilder.Entity<Booking>().HasRequired(b => b.Booker) 
    .WithMany(m => m.BookedSlots).Map(p=>{ 
        p.MapKey("BookerID"); 
    }); 

dans votre cas:

modelBuilder.Entity<Sale>().HasRequired(sale => sale.Shop) 
    .WithMany().Map(s=> { 
      s.MapKey("StoreId"); 
    }); 

Ma version est légèrement différente parce que j'ai des propriétés de navigation des deux côtés de la relation.

+0

Souhaite que je pourrais accepter deux réponses! – dommer

+0

ah merci, heureux qu'il vous ait donné de toute façon ce dont vous aviez besoin –

+0

IsIndependent n'existe pas avec Entity Framework 5. –