2013-08-21 50 views
3

我有一个包含两个表的现有数据库: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

默认情况下,外键的名字将是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); 
    } 
} 

提供外键的配置也请记住,您可以配置密钥和表用流利的配置,你不需要用数据注解属性污染你的实体。

+0

谢谢,但我现在收到了一条不同的错误消息。 \ tSystem.Data.Entity.Edm.EdmAssociationEnd :: Multiplicity在关系'Member_MemberPhoneNumbers'中的角色'Member_MemberPhoneNumbers_Target'中无效。由于依赖角色是指关键属性,所以依赖角色的多重性的上界必须是'1'。 – Mike

+0

@Mike嗯,让我想想。您有MemberId作为电话号码的钥匙。但如果会员有几部手机呢?我认为你的手机应该有单独的ID。您不能将外键作为pk在一对多映射中使用。我对吗? –

+0

是的,你是对的,但我必须按照原样使用结构。我没有设计数据库。我不知道我是否可以在EF Code First中做什么。 – Mike