web-dev-qa-db-fra.com

Mappage des colonnes dans Entity Framework Code en premier

J'ai du mal à mapper mon modèle EF 4.1 Code First à une base de données. Tout fonctionne bien lorsque la base de données correspond exactement au code, mais lorsque j'essaie de mapper lorsque les colonnes diffèrent par leur nom, je rencontre des problèmes.

Je suivais un tutoriel qui devait avoir été construit avec l'une des versions CTP car certaines méthodes sont manquantes/différentes.

Mon modèle ressemble à:

public class Dinner
{
    public int DinnerID { get; set; }  
    public string HostedBy { get; set; }
    public DateTime EventDate { get; set; }
    public string Title { get; set; }
    public string Address { get; set; }
}

public class NerdDinners : DbContext
{
    public DbSet<Dinner> Dinners { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // THIS IS WHAT I TRIED BUT IT IS FAILING
        modelBuilder.Entity<Dinner>().Map(mc =>
            {
                mc.Properties(c => new {
                    colID = c.DinnerID,
                    colTitle = c.Title,
                    colHost = c.HostedBy,
                    colDate = c.EventDate,
                    colAddress = c.Address
                });
                mc.ToTable("tblDinner");
            }
        );
    }
}

Je veux que ma table soit:

tblDinners  
    colID  
    colHost  
    colDate  
    colTitle  
    colAddress  

Je reçois cette erreur:

L'expression de propriétés 'c => new <> f__AnonymousType0`5 (colID = c.DinnerID, colTitle = c.Title, colHost = c.HostedBy, colDate = c.EventDate, colAddress = c.Address)' n'est pas valide. L'expression doit représenter une propriété: C #: 't => t.MyProperty' VB.Net: 'Function (t) t.MyProperty'. Lorsque vous spécifiez plusieurs propriétés, utilisez un type anonyme: C #: 't => new {t.MyProperty1, t.MyProperty2}' VB.Net: 'Function (t) New From {t.MyProperty1, t.MyProperty2}'.

Quelle est la syntaxe appropriée pour mapper les colonnes?

Points bonus si vous me faites savoir comment mapper la propriété d'adresse dans une sous-classe appelée adresse:

public class Address
{
     City
     State
     Zip, etc
}
36
Dismissile

Je crois que tu as juste à faire

modelBuilder.Entity<Dinner>().Property(x => x.HostedBy).HasColumnName("colHost");

pour toutes vos colonnes que vous souhaitez que les noms de colonne db soient nommés différemment de leurs noms de propriété.


Éditer: Après quelques recherches, je suis tombé sur cette question . À en juger par cela et par l'erreur que vous avez publiée, il semble que la mc.Properties() soit plus pour diviser les valeurs en différentes tables, pas pour renommer réellement ces noms de table. Je pense que le changement de nom devra encore être fait manuellement.

Ce sont encore des informations de googler et je n'ai aucune idée si je manque juste un morceau pour faire exactement ce que vous voulez :).

52
KallDrexx

Que diriez-vous d'utiliser DataAnnotations?

[Key]
[Column("ColID", TypeName="int")]
public int DinnerID { get; set; }  

Vous pouvez trouver une liste complète avec des exemples à http://msdn.Microsoft.com/en-us/data/gg193958

43
Kamyar