Mike
Mike

Reputation: 2601

Defining relationships with existing database in code first

I have an existing database with two tables: MemData and MemPhone.

MemData has the following structure

uidMemberId (PK, uniqueidentifier not null)
strFirstName (varchar(50), null)
strLastName (varchar(50), null)

MemPhone has the following structure

uidMemberId (uniqueidentifier not null)
strPhoneNumber (varchar(50), null)

There's no PK on the MemberPhoneNumber table. The two tables are joined by uidMemberId but no foreign keys have been set up in the database.

My MemData Model looks like this:

[Table("MemData")]
public class Member
{
    [Key]
    public Guid MemberId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public virtual IList<MemberPhoneNumber> MemberPhoneNumbers { get; set; }
}

With the configuration map looking like this:

 public MemberMap()
    {

        Property(t => t.MemberId).HasColumnName("uidMemberID");
        Property(t => t.FirstName).HasColumnName("strFirstName");
        Property(t => t.LastName).HasColumnName("strLastName");
        HasMany(x => x.MemberPhoneNumbers);
    }

My MemPhone Model looks like this:

[Table("MemPhone")]
public class MemberPhoneNumber
{
    [Key]
    public Guid MemberId { get; set; }
    public string PhoneNumber { get; set; }
    public virtual Member Member { get; set; }
}

With the configuration map looking like this:

  public MemberPhoneNumberMap()
    {
        Property(t => t.MemberId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
        Property(t => t.MemberId).HasColumnName("uidMemberID");
        Property(t => t.PhoneNumber).HasColumnName("strPhone");

    }

In my MVC app, when I call

Uow.Members.GetAll().Include(p => p.MemberPhoneNumbers).ToList()

I get the following error

Invalid column name 'Member_MemberId'.

It should be looking for MemData_uidMemberId instead but I can't figure out what I've missed in the configuration.

Thanks

Upvotes: 3

Views: 587

Answers (1)

Sergey Berezovskiy
Sergey Berezovskiy

Reputation: 236318

By default foreign key name will be propertyName _ entityId. That's why EF tries to map to Member_MemberId column. Provide foreign key configuration for one-to-many relationship

public class MemberMap : EntityTypeConfiguration<Member>
{
    public MemberMap()
    {
        ToTable("MemData");
        HasKey(m => m.MemberId);
        Property(m => m.MemberId).HasColumnName("uidMemberID");
        Property(m => m.FirstName).HasColumnName("strFirstName");
        Property(m => m.LastName).HasColumnName("strLastName");
        HasMany(x => x.MemberPhoneNumbers)
            .WithRequired(p => p.Member)
            .HasForeignKey(p => p.MemberId);
    }
}

Also keep in mind, that you can configure key and table with fluent configuration, you don't need to pollute your entity with data annotations attributes.

Upvotes: 1

Related Questions