1

我通过了ASP.NET MVC 5 教程并想将现有应用程序重写为 mvc 5。假设我有 2 个表 -Users并且Categories它们连接在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)
    {
       //
    }
}
4

1 回答 1

3

从评论中详细说明:

你的User班级有一个string关键的财产。类别的UserID属性需要具有相同的类型。因为他们不是,我猜 EF 正在尝试修改ID列以匹配UserID的类型,这不应该工作。

但是,补充说明:

您正在通过以下方式设置您的用户 ID

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

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

于 2013-08-31T08:48:24.920 回答