让我试着解释这一点。EF从代码问题生成数据库
我开始了一个新项目(MVC5),并创建了一个包含2个表(来自EF视频示例)博客和帖子的数据库。 我在数据库中创建了关系,然后我从VistualStudioGallery.com下载了EF工具
然后,我使用该工具对表格进行逆向工程,以生成上下文和模型类/映射。
到目前为止这么好。
然后我修改了数据库上下文是这样的:
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跑到我的项目,希望它会产生我的数据库,它做到了。 我注意到,它产生的帖子,博客,AspNetUsers,AspNetUserRoles,AspNetRoles,AspNetUserClaims和AspNetUserLogins表用正确的列和关系。
我然后删除了数据库和AspNetUser模型。 我再除去引用:
- 的EntityFramework
- 微软Asp.net身份核心
- 微软Asp.net身份的EntityFramework
- 微软Asp.net身份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,所以它不可能是0到多对多的关系,IdentityUsers这就是为什么EF添加其他User_Id列,但这没有任何意义。
我的问题是,有没有人遇到过这个? 如果是这样,我如何生成正确的映射来修复它?
请注意,明显我不能改变IdentityUser类,使ICollection的一个参考(即不是一个集合)
/r3plica
有一种映射,使用流畅的API,因为我无法访问IdentityUserLogin类,或者是否可以重写Propery以添加约束? – r3plica
当我添加,我得到以下错误:dentityUserLogin_User_Source::多元化是关系'IdentityUserLogin_User'中的角色'IdentityUserLogin_User_Source'无效。由于依赖角色是指关键属性,所以依赖角色的多重性的上界必须是'1'。 – r3plica