In Entity Framework, is it possible to auto-map a column to an entity property? ID => [tablename]ID

entity-framework, entity-framework-5

Solution

As long as I understand you correctly, you have something like:

public class Foo
{
    public Int32 ID { get; set; }
    // ...
}
public class Bar
{
    public Int32 ID { get; set; }
    // ...
}

And, without too much effort (or creating multiple `entityTypeConfiguration<T>` models) you'd like something along the lines of the following outcome:

Current Mapping                  Desired Mapping

[Foo]                            [Foo]
  ID                               FooID
  ...                              ...
[Bar]                            [Bar]
  ID                               BarID
  ...                              ...

For this, a few methods exist (and depend on which version of EF you're using). With that said, some approachable tactics:

ColumnAttribute

You can visit each entity model and decorate the ID property with the `ColumnAttribute`. This tells EF that, despite what we named the column, we want something else to be the name within the database. e.g.

public class Foo
{
    [Column("FooID")]
    public Int32 ID { get; set; }
    // ...
}
public class Foo
{
    [Column("BarID")]
    public Int32 ID { get; set; }
    // ...
}

The only problem here is that you're now going to every model and adding the attribute.

OnModelCreating & Fluent Mapping

Another method is to do the mapping but keep it all in one place. The `OnModelCreating` event is great for this kind of thing.

public class MyDbContext : DbContext
{
    public Dbset<Foo> Foos { get; set; }
    public DbSet<Bar> Bars { get; set; }

    protected override void OnmodelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Foo>()
            .Property(x => x.ID).HasColumnName("FooID");
        modelBuilder.Entity<Bar>()
            .Property(x => x.ID).HasColumnName("BarID");
    }
}

Again, the problem here is that you're creating a configuration for each entity.

Custom Conventions

As of EF6, you can use Custom Conventions which make things easier (Including developing your own convention that would make `ID`=`TableNameID`). Unfortunately I don't have the time to write an example, but the docs are pretty enlightening.

Problem

I want to use .Id in my entity classes for the unique id, but our dba wants [tablename]Id in the database tables. Is there a way that Entity Framework can make this mapping automatically without having to create a new map file for every entity?

Original source