首先在代码中定义与现有数据库的关系

时间:2013-08-21 19:57:25

标签: entity-framework ef-code-first

我有一个包含两个表的现有数据库:MemData和MemPhone。

MemData具有以下结构

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

MemPhone具有以下结构

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

MemberPhoneNumber表上没有PK。这两个表由uidMemberId连接,但数据库中没有设置外键。

我的MemData模型如下所示:

[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; }
}

配置图如下所示:

 public MemberMap()
    {

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

我的MemPhone模型如下所示:

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

配置图如下所示:

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

    }

在我的MVC应用程序中,当我打电话

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

我收到以下错误

Invalid column name 'Member_MemberId'.

它应该寻找MemData_uidMemberId,但我无法弄清楚我在配置中错过了什么。

由于

1 个答案:

答案 0 :(得分:1)

默认情况下,外键名称为 propertyName _ entityId 。这就是EF尝试映射到Member_MemberId列的原因。为一对多关系提供外键配置

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

另外请记住,您可以使用流畅的配置配置密钥和表,您不需要使用数据注释属性污染您的实体。