实体框架一对零或一的外键关联
本文关键字:关联 框架 实体 | 更新日期: 2023-09-27 18:01:44
我正在更改现有应用程序的后端以首先使用实体框架代码。我使用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]
上创建一个外键?
我最终创建了一对多关系,为Login设置了一个[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");
}
}
您可以像这样先编写代码。实体框架将自动为您生成外键TeamMemberId
。更多信息:实体框架教程代码优先约定
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; }
}