2014-02-24 75 views
2

所以我試圖使用MVC 4互聯網應用程序模板和UserProfile數據庫表爲它創建帳戶,然後添加表具有依賴於UserProfile表格以獲取更多信息。實體框架codefirst issue無法確定類型之間的關聯主體端

該模型將UserProfile 0 ---> 1 UserType1 and UserProfile 0 ----> UserType2 在USERPROFILE表可能有UserType1依賴紀錄,可能有相關紀錄UserType2,如果有任一UserType1UserType2一個條目的主鍵是一個外鍵是UserId從用戶配置文件

的POCO是:

public class UserProfile 
{ 

    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 
    public string Email { get; set; } 
    public string UserName { get; set; } 
    public int type { get; set; } 
    public virtual UserType1 UserType1 { get; set; } 
    public virtual UserType2 UserType2 { get; set; } 

public class UserType1 
{ 
    [key,ForeignKey("UserProfile")] 
    public virtual int UserId {get;set;} 
    public int myval {get;set;} 
    public UserProfile UserProfile {get; set;} 
} 

public class UserType2 //same as usertype 1 

我試着將模型映射語句,但無濟於事

爲用戶配置模型映射數據:

public class UserProfileMap : EntityTypeConfiguration<UserProfile> 
{ 
    public UserProfileMap() 
    { 
     // Primary Key 
     this.HasKey(t => t.UserId); 

     // Properties 
     this.Property(t => t.Email) 
      .IsRequired() 
      .HasMaxLength(56); 

     this.Property(t => t.UserName) 
      .IsRequired() 
      .HasMaxLength(50); 

     // Table & Column Mappings 
     this.ToTable("UserProfile"); 
     this.Property(t => t.UserId).HasColumnName("UserId"); 
     this.Property(t => t.Email).HasColumnName("Email"); 
     this.Property(t => t.UserName).HasColumnName("UserName"); 
     this.Property(t => t.UserType).HasColumnName("UserType"); 

     this.HasOptional(e => e.UserType1).WithRequired(); 

爲usertypes模型映射的數據是這樣的:

public class UserType1 : EntityTypeConfiguration<UserType1> 
{ 
    public UserType1Map() 
    { 
     // Primary Key 
     this.HasKey(t => t.UserId); 

     // Properties 
     this.Property(t => t.UserId) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

     this.HasRequired(t => t.UserProfile).WithOptional(); 


     this.Property(t => t.Company) 
      .IsRequired() 
      .HasMaxLength(50); 

     // Table & Column Mappings 
     this.ToTable("UserType1"); 
     this.Property(t => t.UserId).HasColumnName("UserId"); 
     this.Property(t => t.Company).HasColumnName("Company"); 


     // Relationships 
     this.HasRequired(t => t.UserProfile).WithOptional(); 

    } 
} 

但我總是得到這個錯誤無法確定之間的關聯的主要終點類型'myApp.Models.UserType1'和'myApp.Models.UserProfile'。該關聯的主要目的必須使用關係流暢API或數據註釋來顯式配置。

我錯過了什麼?

回答

2

配置關係只有一個實體(在你的情況下,在UserProfileMap)。明確指定.WithRequired()調用中的屬性。下面是爲我工作的演示代碼:

modelBuilder.Entity<SharedKeyRequired>() 
    .HasOptional(skr => skr.SharedKeyOptional) 
    .WithRequired(sko => sko.SharedKeyRequired); 


public class SharedKeyRequired 
{ 
    public int SharedKeyRequiredId { get; set; } 

    public virtual SharedKeyOptional SharedKeyOptional { get; set; } 
} 

public class SharedKeyOptional 
{ 
    public int SharedKeyOptionalId { get; set; } 

    public virtual SharedKeyRequired SharedKeyRequired { get; set; } 
} 
+0

謝謝!我必須從你提供的內容中做出一點小改變。實體框架不喜歡SharedKeyOptionalClass上沒有外鍵的事實。我使用數據符號並在sko中爲int值添加了[Key,ForeignKey(「SharedKeyRequired」)]。 – Himilou

0

莫霍面,我投你的答案是正確的,但我想我會把MVC等效源這裏那些可能由verbage混淆。

期望的最終結果是使用MVC AccountModel並添加代碼優先的表,其具有外鍵作爲其主鍵來與可選的1對1的關係

延長用戶配置表修改您的用戶配置文件的類添加虛擬引用您的新表

[Table("UserProfile")] 
public class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 
    public string UserName { get; set; } 

    public virtual UserInfo UserInfo { get; set; } 
} 

創建新表,我選擇用數據符號,你可以在模型構建器將其指定爲 modelBuilder.Entity()HasKey(K => k.UserId)。 modelBuilder.Entity()。Property(ui => ui.UserId) .HasDatabaseGeneratedOption(DatabaseGeneratedOption。沒有);

public class UserInfo 
{ 
    [Key,ForeignKey("UserProfile")] //use above or specify this 
    public int UserId { get; set; } 
    public virtual UserProfile UserProfile { get; set; } 
    public int somevalue { get; set; } 
    public string name { get; set; } 

} 

覆蓋你上下文類的你的OnModelCreating構件並指定關係作爲莫霍指出 公共類UsersContext:的DbContext { 公共UsersContext() :基部( 「DefaultConnection」) { }

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // modelBuilder.Entity<UserInfo>().HasKey(k => k.UserId); 
     // modelBuilder.Entity<UserInfo>().Property(ui => ui.UserId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
     modelBuilder.Entity<UserProfile>().HasOptional(ui => ui.UserInfo).WithRequired(up => up.UserProfile); 
     base.OnModelCreating(modelBuilder); 
    } 


    public DbSet<UserProfile> UserProfiles { get; set; } 
    public DbSet<UserInfo> UserInfoes { get; set; } 
} 
相關問題