Search code examples
asp.net-mvc-4entity-framework-5fluent-interface

Entity Framework and using Fluent API for mapping two entities to another one


Scenario seems to be trivial and I'm really confused on what I'm doing wrong.

So, I have a Client class

 public class Client
{
    [Key]
    public int ClientID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public virtual Account Account { get; set; }

 }

Employee class

public class Employee
{
    [Key]
    public int EmployeeID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public virtual Account Account { get; set; }
}

and an Account class

public class Account
{
    [Key]
    public int AccountID { get; set; }
    public string Login { get; set; }
    public string Password { get; set; }

    public virtual Employee Employee { get; set; }
    public virtual Client Client { get; set; }
}

Both Client and Employee may have an Account or not ( online access is optional ). As database is not compatible with EF namingconvention I have to come up with Fluent API explicit mappings.

Both Client and Employee tables have "AccountID" column that I'm trying to use to build a relation.

        modelBuilder.Entity<Client>()
            .HasOptional(e => e.Account)
            .WithRequired(a => a.Client)
            .Map(m => m.MapKey("AccountID"));

        modelBuilder.Entity<Employee>()
            .HasOptional(e => e.Account)
            .WithRequired(a => a.Employee)
            .Map(m => m.MapKey("AccountID"));

but I get

Schema specified is not valid. Errors: 
(15,6) : error 0019: Each property name in a type must be unique. Property name 'AccountID' was already defined.
(16,6) : error 0019: Each property name in a type must be unique. Property name 'AccountID' was already defined.

so, is there a way to fix this other than modification of the table/entity structure?


Solution

  • Turns out you don't need Fluent API in this case, what you need is to DataAnnotate your properties in Entities with InverseProperty attribute

    [InverseProperty("AccountID")]
    

    There is a great answer by Ladislav Mrnka in Entity Framework 4.1 InverseProperty Attribute question

    However if anyone knows how to do that correctly with Fluent answers are highly appreciated