实体框架错误:对象'PK_dbo.User'依赖于列'Id'



我通过了ASP.NET MVC 5教程,希望将现有的应用程序重写为MVC 5。假设我有两个表——UsersCategories,它们在UserID上连接。

在mvc5中,我们可以将身份验证模型连接到数据库,所以我用更新了示例User模型

public ICollection<Category> Categories { get; set; }

同样在Category模型中,我添加了

public int UserID { get; set; }
public User User { get; set; }

我在mvc3/ef4为我工作。但当我进行迁移时,我会遇到错误:

对象"PK_dbo.User"依赖于列"Id"。由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN Id失败。

以下是我的型号:

用户(样本项目的1对1+类别链接)

public class User : IUser
{
    public User()
        : this(String.Empty)
    {
    }
    public User(string userName)
    {
        UserName = userName;
        Id = Guid.NewGuid().ToString();
    }
    [Key]
    public string Id { get; set; }
    public string UserName { get; set; }
    public ICollection<Category> Categories { get; set; }
}

类别模型

public class Category
{
    public int UserID { get; set; }
    public User User { get; set; }
    public int ID { get; set; }
    public int ParentID { get; set; }
    public string Name { get; set; }
    //....
}

上下文

public class BackendDBContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<UserSecret> Secrets { get; set; }
    public DbSet<UserLogin> UserLogins { get; set; }
    public DbSet<Role> Roles { get; set; }
    public DbSet<UserRole> UserRoles { get; set; }
    public DbSet<Category> Categories { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }
    protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items)
    {
       //
    }
}

从注释中细化:

您的User类具有string密钥属性。类别的UserID属性需要具有相同的类型。由于它们不是,我猜测EF正试图修改ID列以匹配UserID的类型,这是不可行的。

不过,还有一点需要注意:

您正在通过设置用户ID

Id = Guid.NewGuid().ToString();

而是用于存储的自然类型是CCD_ 11(SQL Server中的CCD_。您可以将用户的ID属性和类别的UserID属性都更改为该属性。

相关内容

最新更新