实体框架:向用户对象添加集合(list, HashSet, Dictionary)导致空白迁移
本文关键字:Dictionary HashSet 迁移 空白 list 框架 用户 对象 集合 添加 实体 | 更新日期: 2023-09-27 17:49:28
我正在努力工作的预建实体网站,自带MVC4,我试图改变用户对象,包括额外的字段。
如果我在AccountModels.cs
中有以下代码[Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
public List<string> Test { get; set; }
}
(注意,我添加了List Test {get;set;})
然后在包管理器控制台中运行以下命令,
Add-Migration "List"
Update-Database
生成的Migration类是这样的。
public partial class List : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
但是,如果我只是向AccountModels.cs添加一个标量变量,那么它就会出现在生成的迁移类中,没有问题,如下所示:
public partial class singleString : DbMigration
{
public override void Up()
{
AddColumn("dbo.UserProfile", "NameList", c => c.String());
}
public override void Down()
{
DropColumn("dbo.UserProfile", "NameList");
}
}
为什么当我尝试添加一个集合时它不工作?
您希望实体框架如何映射List<string>
。字符串不会映射到任何数据库表。它只是一个字符串。如果你把它改成一个类,那么它会为它创建一个迁移。
Entity Framework将ICollection<T>
视为一对多关系(除非在关系的另一端有一个集合)。由于您使用的是字符串,因此它不会将其视为任何有意义的数据库映射,因为它无法将字符串映射到表。如果您添加了如下的新类:
[Table("UserAddress")]
public class UserAddress
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserAddressId{ get; set; }
// foreign key to UserProfile
public int UserProfileId { get; set; }
// navigation property to UserProfile
public UserProfile Profile { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string ZipCode { get; set; }
}
现在如果你要改变UserProfile包含地址:
public List<UserAddress> Addresses { get; set; }
EF将创建一个迁移,在UserProfile和UserAddress之间添加一个一对多关系的新表。