实体框架:向用户对象添加集合(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, HashSet, Dictionary)导致空白迁移

您希望实体框架如何映射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之间添加一个一对多关系的新表。