48

I've made a simple Entity Framework ASP Core Application that works but I do not know why:

I've made a context like this:

public class AstootContext : DbContext
{
    public AstootContext(DbContextOptions<AstootContext> options)
        : base(options)
    { }

    public DbSet<Account> Accounts { get; set; }
    public DbSet<User> Users { get; set; }
}

And I have two tables with models like this:

public class Account
{
    public int Id { get; set; }
    public string Username { get; set; }
    public string PasswordHash { get; set; }
    public DateTime Created { get; set; }

    List<User> Users { get; set; }
}

public class User
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public DateTime Birthday { get; set; }
    public Account Account { get; set; }
}

The interesting thing is that when I run my application it actually can pick up the data. It just seems weird because I have not specified any table mapping. I'm assuming this just automaps because the specified tables are the same name.

My questions are:

  1. How do I specify Table explicit table mapping in case I do not want my model names to be exactly the same as the DB?

  2. How do I specify Custom Column Mapping.

  3. Is there anything special I have to specify for Primary/Foreign Keys

edit

To clarify

  1. Say I had a table in the DB MyAccounts and I wanted to map that to an entity Accounts.

  2. Say I had a column password and I wanted that to map to a POCO property PasswordHash

8
  • You have a bunch of questions here, you should really only be asking one. Commented Feb 12, 2017 at 17:40
  • 1
    @DavidG they're all related to to specific mapping, future users will only need to go to one question to find a nice full answer, I will put a bounty if need be Commented Feb 12, 2017 at 17:46
  • What do you mean by question 2, are you wanting to name your columns? Commented Feb 12, 2017 at 17:48
  • My column in the database is named password but it's named in the model passwordHash, I can't imagine that entityframework could automatically resolve that, how can I point that property to the column Commented Feb 12, 2017 at 17:50
  • It's not possible that EF has renamed your password column, are you sure you have no code that is doing it for you? Any attributes you are not showing or the context setup? Commented Feb 12, 2017 at 17:51

1 Answer 1

79
  1. To specify the name of the database table, you can use an attribute or the fluent API:

    Using Attributes:

     [Table("MyAccountsTable")]
     public class Account
     {
          public string PasswordHash { get; set; }
     }
    

    Using Fluent API:

     public class YourContext : DbContext
     {
         protected override void OnModelCreating(ModelBuilder builder)
         {
             builder.Entity<Account>(entity => {
                 entity.ToTable("MyAccountsTable");
             });
         }
     }
    
  2. To name your columns manually, it's very similar and you can use an attribute or the fluent API:

    Using Attributes:

     public class Account
     {
         [Column("MyPasswordHashColumn")]
         public string PasswordHash { get; set; }
    
     }
    

    Using Fluent API:

     public class YourContext : DbContext
     {
         protected override void OnModelCreating(ModelBuilder builder)
         {
             builder.Entity<Account>(x => x
                 .ToTable("MyAccountsTable")
                 .Property(entity => entity.PasswordHash)
                     .HasColumnName("MyPasswordHashColumn")
             );
         }
     }
    
Sign up to request clarification or add additional context in comments.

8 Comments

Thanks this is perfect, do you happen to have a link to where in the documentation is specifies the it's auto magic way of syncing to the Model names to the DB
You can see some of it in here regarding the column names and in here.
Table attribute does not seem to work anymore. Neither DbSet names. The only way I can achieve my custom names is the fluent api on the builder. (as of .NET Core 3 Preview 5)
@g.pickardou Well, I'm not going to comment on something that is only in preview, come back when the platform has stabilised a bit more.
Why is the type <Language>?
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.