我传递ASP.NET MVC 5 tutorial并希望将现有应用重写为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)
{
//
}
}
答案 0 :(得分:2)
从评论中阐述:
您的User
班级有string
个关键字属性。类别的UserID
属性需要具有相同的类型。由于它们不是,我猜测EF正在尝试修改ID
列以匹配UserID
的类型,这不应该起作用。
然而,补充说明:
您正在通过
设置用户IDId = Guid.NewGuid().ToString();
但是用于存储的自然类型是Guid
(SQL Server中的uniqueidentifier
)。您可以将用户的ID
属性和类别的UserID
属性更改为该属性。