2013-12-11 41 views
2

让我试着解释这一点。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跑到我的项目,希望它会产生我的数据库,它做到了。 我注意到,它产生的帖子博客AspNetUsersAspNetUserRolesAspNetRolesAspNetUserClaimsAspNetUserLogins表用正确的列和关系。

我然后删除了数据库和AspNetUser模型。 我再除去引用:

  1. 的EntityFramework
  2. 微软Asp.net身份核心
  3. 微软Asp.net身份的EntityFramework
  4. 微软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

回答

0

因为公约

public class IdentityUserLogin 
{ 

public IdentityUserLogin(); 

public virtual string LoginProvider { get; set; } 
public virtual string ProviderKey { get; set; } 
public virtual string UserId { get; set; } // if i am the key to IdentityUser 

[ForeignKey("UserId")] // IdentityUserId instead of USerId may have worked. 
         // see http://msdn.microsoft.com/en-us/data/jj713564 and 
         // http://msdn.microsoft.com/en-us/data/jj591583 
public virtual IdentityUser User { get; set; } 

}

EDIT2流利的API ..按要求1的变化:1/!: M/M:M,必需/可选等

modelBuilder.Entity<IdentityUserLogin>().HasRequired(t=>t.IdentityUser).WithMany().HasForeignKey(t=>t.UserId) 

fluent api

+0

有一种映射,使用流畅的API,因为我无法访问IdentityUserLogin类,或者是否可以重写Propery以添加约束? – r3plica

+0

当我添加,我得到以下错误:dentityUserLogin_User_Source::多元化是关系'IdentityUserLogin_User'中的角色'IdentityUserLogin_User_Source'无效。由于依赖角色是指关键属性,所以依赖角色的多重性的上界必须是'1'。 – r3plica

相关问题