Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mapping Columns in Entity Framework Code First

I'm having trouble trying to map my EF 4.1 Code First model to a database. Everything works fine when the database match the code exactly, but when I try and map when the columns differ in name then I am running into issues.

I was following a tutorial that must've been built with one of the CTP builds because some of the methods are missing/different.

My model looks like:

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

I want my table to be:

tblDinners       colID       colHost       colDate       colTitle       colAddress   

I am getting this error:

The properties expression 'c => new <>f__AnonymousType0`5(colID = c.DinnerID, colTitle = c.Title, colHost = c.HostedBy, colDate = c.EventDate, colAddress = c.Address)' is not valid. The expression should represent a property: C#: 't => t.MyProperty' VB.Net: 'Function(t) t.MyProperty'. When specifying multiple properties use an anonymous type: C#: 't => new { t.MyProperty1, t.MyProperty2 }' VB.Net: 'Function(t) New From { t.MyProperty1, t.MyProperty2 }'.

What is the proper syntax to map the columns?

Bonus Points if you let me know how to map the Address Property into a subclass called Address:

public class Address {      City      State      Zip, etc } 
like image 957
Dismissile Avatar asked May 19 '11 16:05

Dismissile


People also ask

How do I code first in Entity Framework?

Step 1 − First, create the console application from File → New → Project… Step 2 − Select Windows from the left pane and Console Application from the template pane. Step 3 − Enter EFCodeFirstDemo as the name and select OK. Step 4 − Right-click on your project in the solution explorer and select Manage NuGet Packages…

What is mapping in Entity Framework?

It is a tool to access the database. More accurately, it's classified as an Object/Relational Mapper (ORM) which means it maps data in a relational database into objects of our applications. Entity Framework. It is a tool to access the database.


2 Answers

I believe you just have to do

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

for all of your columns that you want the db column names to be named differently than their property names.


Edit: After some more searching I came across this question. Judging from that and the error you posted, it seems like the mc.Properties() is more for splitting values into different tables, not to actually rename those table names. I think renaming will still have to be done on a manual basis.

This is again information from googling and I have no idea if I am just missing a piece to do exactly what you want :).

like image 164
KallDrexx Avatar answered Sep 20 '22 03:09

KallDrexx


How about using DataAnnotations?

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

You can find a full list with samples at http://msdn.microsoft.com/en-us/data/gg193958

3rd party edit

The link above redirects to Entity Framework 6 overview. You are probably looking for

  • Entity Framework Core - Entity Properties entity properties map to table columns

  • Entity Framework 6 - Code First Data Annotations

like image 21
Kamyar Avatar answered Sep 18 '22 03:09

Kamyar