【问题标题】:EF Generate database from code issuesEF 从代码问题生成数据库
【发布时间】: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 运行了我的项目,希望它能生成我的数据库,它确实做到了。 我注意到它生成了 PostsBlogsAspNetUsersAspNetUserRolesAspNetRolesAspNetUserClaimsAspNetUserLogins 表具有正确的列和关系。

然后我删除了数据库和 AspNetUser 模型。 然后我删除了对以下内容的引用:

  1. 实体框架
  2. Microsoft Asp.net 身份核心
  3. Microsoft Asp.net 身份实体框架
  4. 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


    【解决方案1】:

    因为约定

    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 Fluent API .. 根据需要更改 1:1/!:M/M:M、必需/可选等

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

    fluent api

    【讨论】:

    • 有没有办法使用流利的 api 映射它,因为我无权访问 IdentityUserLogin 类,或者我可以覆盖属性以添加约束?
    • 当我添加它时,我收到以下错误:dentityUserLogin_User_Source: : Multiplicity is not valid in Role 'IdentityUserLogin_User_Source' in relationship 'IdentityUserLogin_User'。因为从属角色引用关键属性,所以从属角色的多重性的上限必须是'1'。
    猜你喜欢
    • 2014-06-18
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    相关资源
    最近更新 更多