2013-12-11 39 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

相關問題