【发布时间】:2017-01-12 23:15:17
【问题描述】:
我将 EntityFramework 6.1.3 与 CodeFirst 一起用于 Asp.Net 应用程序。我有一个现有表(“用户”),我正在尝试在其上添加外键 “GroupId”。 这是类(带有 //new 的所有内容都是上次迁移后所做的更改)
[Table("Users")]
public class User
{
[Key]
[Column("PK_USER")]
public int Id { get; set; }
[Column("Username")]
public string Username { get; set; }
[Column("Name")]
public string Name { get; set; }
[Column("Password")]
public string Password { get; set; }
[Column("Firstname")]
public string Firstname { get; set; }
[Column("Lastname")]
public string Lastname { get; set; }
[Column("LastLogin")]
public DateTime? LastLogin { get; set; }
[Column("Department")]
public string Department { get; set; }
[Column("EMail")]
public string EMail { get; set; }
[Column("IsWindowsUser")]
public bool? IsWindowsUser { get; set; }
[Column("Signature")]
public string Signature { get; set; }
[Column("FK_ROLE")]
public int? RoleId { get; set; }
[ForeignKey("RoleId")]
public virtual Role Role { get; set; }
// new
[Column("GroupId")]
public int? GroupId { get; set; }
//new
[ForeignKey("GroupId")]
public virtual Group Group { get; set; }
//new
public virtual ICollection<GroupResponsibility> Responsibilites { get; set; }
public virtual ICollection<UserField> UserFields { get; set; }
public override string ToString()
{
return Username;
}
}
在我运行 add-migration 后会生成以下代码(省略其他更改)
AddColumn("dbo.Users", "GroupId", c => c.Int());
AddColumn("dbo.Users", "Group_Id", c => c.Int());
CreateIndex("dbo.Users", "GroupId");
CreateIndex("dbo.Users", "Group_Id");
AddForeignKey("dbo.Users", "Group_Id", "dbo.Groups", "Id");
AddForeignKey("dbo.Users", "GroupId", "dbo.Groups", "Id");
如您所见,EntityFramework 识别了外键,但仍添加了一个默认的“Group_Id”。如果我通过它并更新数据库,导航属性“Group”将关联到“Group_Id”而不是所需的“GroupId”。
有什么可能导致这种情况的想法吗?
更新 1
我注释掉了导航属性并得到了相同的结果。看起来关系另一端的 ICollection Users 是罪魁祸首。这是类“组”
[Table("Groups")]
public class Group
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public int? GroupLeaderId { get; set; }
[ForeignKey("GroupLeaderId")]
public virtual User GroupLeader { get; set; }
public virtual ICollection<User> Users { get; set; }
public virtual ICollection<GroupResponsibility> Responsibilites { get; set; }
public virtual ICollection<ApplicationForm> Applications { get; set; }
public override string ToString()
{
return Name;
}
}
如果我注释掉 ICollection Users,我会在添加迁移时收到以下异常:
无法确定类型“SparePartsDb.Entities.Group”和“SparePartsDb.Entities.User”之间关联的主体端。此关联的主体端必须使用关系流式 API 或数据注释显式配置。
更新 2
经过一番谷歌搜索并更改 Group 类的 Key 属性...
[Key, ForeignKey("GroupLeader")]
public int Id { get; set; }
...我可以注释掉 ICollection 并运行迁移。但是,GroupId 不再被识别为外键,即使导航属性存在于 User 类中。
AddColumn("dbo.Users", "GroupId", c => c.Int());
【问题讨论】:
-
看起来是正确的。多余的列定义不应该影响它(如果它们与属性名称匹配,则不需要列注释)。我会尝试注释掉 nav 属性,看看生成了什么。
-
@SteveGreene:我注释掉了导航属性并得到了相同的结果。看起来关系另一端的 ICollection 用户是罪魁祸首。我更新了我的帖子。
标签: c# sql-server entity-framework ef-code-first