【发布时间】:2013-12-29 09:48:07
【问题描述】:
让我试着解释一下。
我开始了一个新项目 (MVC5),并创建了一个包含 2 个表(来自 EF 视频示例)博客和帖子的数据库。 我在数据库中创建了关系,然后从 VistualStudioGallery.com 下载了 EF 工具
然后我使用该工具对表格进行逆向工程以生成上下文和模型类/映射。
到目前为止一切顺利。
然后我将 db 上下文修改为如下所示:
public partial class EfExampleContext : IdentityDbContext<ApplicationUser>
{
public EfExampleContext()
: base("Name=DefaultConnection")
{
}
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new BlogMap());
modelBuilder.Configurations.Add(new PostMap());
}
}
然后我删除了数据库,F5 运行了我的项目,希望它能生成我的数据库,它确实做到了。 我注意到它生成了 Posts、Blogs、AspNetUsers、AspNetUserRoles、AspNetRoles 、AspNetUserClaims 和 AspNetUserLogins 表具有正确的列和关系。
然后我删除了数据库和 AspNetUser 模型。 然后我删除了对以下内容的引用:
- 实体框架
- Microsoft Asp.net 身份核心
- Microsoft Asp.net 身份实体框架
- Microsoft Asp.net Identity Owin
然后使用最新版本安装它们。我这样做是因为我想使用 IdentityUser 而不是 AspNetUser(存在一些差异)。
然后我 F5 运行我的项目来创建我的数据库,这就是问题开始的地方......
IdentityUser 如下所示:
public class IdentityUser : IUser
{
public IdentityUser();
public IdentityUser(string userName);
public virtual ICollection<IdentityUserClaim> Claims { get; }
public virtual string Id { get; set; }
public virtual ICollection<IdentityUserLogin> Logins { get; }
public virtual string PasswordHash { get; set; }
public virtual ICollection<IdentityUserRole> Roles { get; }
public virtual string SecurityStamp { get; set; }
public virtual string UserName { get; set; }
}
注意 ICollection 导航属性。 IdentityUserLogin 模型如下所示:
public class IdentityUserLogin
{
public IdentityUserLogin();
public virtual string LoginProvider { get; set; }
public virtual string ProviderKey { get; set; }
public virtual IdentityUser User { get; set; }
public virtual string UserId { get; set; }
}
如您所见,IdentityUser 可以有 多个 登录,而登录有 一个 用户。如果我运行该项目,IdentityUserLogins 表如下所示:
CREATE TABLE [dbo].[IdentityUserLogins](
[UserId] [nvarchar](128) NOT NULL,
[LoginProvider] [nvarchar](max) NULL,
[ProviderKey] [nvarchar](max) NULL,
[User_Id] [nvarchar](128) NULL,
CONSTRAINT [PK_dbo.IdentityUserLogins] PRIMARY KEY CLUSTERED
(
[UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
这里有问题。 UserId 是一个 PK,因此它不能是与 IdentityUsers 的 0 对多关系,这就是 EF 添加其他 User_Id 列的原因,但这没有任何意义。
我的问题是,以前有人遇到过这种情况吗? 如果是这样,我如何生成正确的映射来修复它?
请注意,显然我无法更改 IdentityUser 类以使 ICollection 成为单个引用(即不是集合)
/r3plica
【问题讨论】:
标签: c# asp.net sql entity-framework asp.net-mvc-5