我通过了ASP.NET MVC 5教程,希望将现有的应用程序重写为MVC 5。假设我有两个表——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)
{
//
}
}
从注释中细化:
您的User
类具有string
密钥属性。类别的UserID
属性需要具有相同的类型。由于它们不是,我猜测EF正试图修改ID
列以匹配UserID
的类型,这是不可行的。
不过,还有一点需要注意:
您正在通过设置用户ID
Id = Guid.NewGuid().ToString();
而是用于存储的自然类型是CCD_ 11(SQL Server中的CCD_。您可以将用户的ID
属性和类别的UserID
属性都更改为该属性。