2

我正在更改现有应用程序的后端以使用实体框架代码优先的过程。我已经使用Visual Studio 2015中的内置工具来基于我现有的数据库生成POCO类。除了两个类之外,这种方法大部分工作都很完美,具有一对一或一对一的关系。这些是我(简化)类:实体框架一对零或一个外键关联

public class Login 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public int TeamMemberId { get; set; } 
    public virtual TeamMember TeamMember { get; set; } 
} 

public class TeamMember 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public virtual Login Login { get; set; } 
} 

通过以下配置:

public class LoginTypeConfiguration : EntityTypeConfiguration<Login> 
{ 
    public LoginTypeConfiguration() 
    { 
     this.HasRequired(e => e.TeamMember) 
      .WithOptional(e => e.Login); 

     this.Property(e => e.TeamMemberId) 
      .HasColumnName("TeamMember_Id"); 
    } 
} 

这将导致以下迁移:

CreateTable(
    "dbo.Logins", 
    c => new 
     { 
      Id = c.Int(nullable: false, identity: true), 
      TeamMember_Id = c.Int(nullable: false), 
     }) 
    .PrimaryKey(t => t.Id) 
    .ForeignKey("dbo.TeamMembers", t => t.Id) 
    .Index(t => t.Id); 

出于某种原因,EF创建一个外键[Logins].[Id]而不是[Logins].[TeamMember_Id]。我已经尝试用ForeignKey属性装饰我的导航属性,但这不起作用。有没有办法让它在[Logins].[TeamMember_Id]上创建外键?

+0

OMG。我有这个确切的问题。你有幸找到它了吗? –

回答

0

我结束了创建一个一对多的关系,一个[NotMapped]属性登录。

我的课:

public class Login 
{ 
    public int TeamMemberId { get; set; } 
    public virtual TeamMember TeamMember { get; set; } 
} 

public class TeamMember 
{ 
    [NotMapped] 
    public virtual Login Login 
    { 
     get { return Logins.FirstOrDefault(); } 
    } 

    public virtual ICollection<Login> Logins { get; set; } 
} 

通过以下配置:

public class LoginTypeConfiguration : EntityTypeConfiguration<Login> 
{ 
    public LoginTypeConfiguration() 
    { 
     this.Property(e => e.TeamMemberId) 
      .HasColumnName("TeamMember_Id"); 
    } 
} 
0

为此,您可以先写这样的代码。实体框架将自动为您生成外键TeamMemberId。欲了解更多信息:Entity Framework Tutorial - Code First Conventions

public class Login 
{ 
    public int Id { get; set; } //foreign key declaration 
    public int TeamMemberId { get; set; } 
    public TeamMember TeamMember { get; set; } 
} 

public class TeamMember 
{ 
    public int TeamMemberId { get; set; } 
    public Ilist<Login> Login { get; set; } 
} 
+1

我知道Entity Framework会自动生成属性'TeamMember_Id'。但我需要明确定义它,因为代码引用了这个属性。此外,它应该是一对一或一对一的关系,而不是像您的代码所暗示的那样是一对多关系。 –