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

时间:2013-08-31 07:59:06

标签: c# asp.net-mvc entity-framework asp.net-mvc-5

我传递ASP.NET MVC 5 tutorial并希望将现有应用重写为mvc 5。 假设我有2个表 - 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)
    {
       //
    }
}

1 个答案:

答案 0 :(得分:2)

从评论中阐述:

您的User班级有string个关键字属性。类别的UserID属性需要具有相同的类型。由于它们不是,我猜测EF正在尝试修改ID列以匹配UserID的类型,这不应该起作用。

然而,补充说明:

您正在通过

设置用户ID
Id = Guid.NewGuid().ToString();

但是用于存储的自然类型是Guid(SQL Server中的uniqueidentifier)。您可以将用户的ID属性和类别的UserID属性更改为该属性。