0

這是我ApplicationUser class.I僅添加了一個新的屬性----配置在asp.net身份一一對應的關係

public class ApplicationUser : IdentityUser 
    { 
    //public ApplicationUser() 
    //{ 
    // UserProfileInfo = new UserProfileInfo { ImageSize = 0, FileName = null, ImageData = 0 }; 
    //} 
    public string HomeTown { get; set; } 
    public virtual UserProfileInfo UserProfileInfo { get; set; } 

,這是我userProfileInfo類,我想保存每個用戶的個人資料相片後,他們已經完成了註冊----

public class UserProfileInfo 
    { 
    // [Key, ForeignKey("ApplicationUser")] 
    [Key] 
    public int Id { get; set; } 
    public int ImageSize { get; set; } 
    public string FileName { get; set; } 
    public byte[] ImageData { get; set; } 

    [ForeignKey("Id")] 
    public virtual ApplicationUser ApplicationUser { get; set; } 
} 

,這是我的DbContext類-----

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
    { 
    public ApplicationDbContext() 
     : base("DefaultConnection") 
    { 
    } 

    public DbSet<UserProfileInfo> UserProfileInfo { get; set; } 

現在,問題是我無法配置ApplicationUser類和UserProfileInfo類之間的一對一關係。我嘗試過各種方法來做到這一點,並遵循先前提出的一些堆棧溢出問題。但在完成我的註冊表單後,錯誤------

無法確定類型「CodeFirstContext.ApplicationUser」和「CodeFirstContext.UserProfileInfo」之間關聯的主體端點。該關聯的主要目的必須使用關係流暢API或數據註釋來顯式配置。

我也試圖把關係用流利的API -----

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // base.OnModelCreating(modelBuilder); 

     //// Configure Id as PK for UserProfileInfo class 
     modelBuilder.Entity<UserProfileInfo>() 
      .HasKey(e => e.Id); 

     // Configure Id as FK for UserProfileInfo 
     modelBuilder.Entity<ApplicationUser>() 
      .HasOptional(s => s.UserProfileInfo) 
      .WithRequired(ad => ad.ApplicationUser); 
    } 

這樣,我也失敗。請建議我如何配置它的幫助。

回答

1

你幾乎在那裏。 首先,您可以刪除屬性(Key,foreignkey)上的所有註釋,因爲按照約定,您的列的名稱爲主鍵(並且您的關係與此關聯)。

其次,你只需要流利地從一個實體的映射關係,例如從Applicationuser到UserProfileInfo這樣的:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<ApplicationUser>() 
      .HasOptional(c => c.UserProfileInfo) 
      .WithRequired(d => d.ApplicationUser); 
     base.OnModelCreating(modelBuilder); 
    } 

注:這一點,如果您的個人資料的關係是可選的,否則使用,HasRequired。 如果你現在想爲你可以添加一個用戶配置文件設置:

var user = UserManager.FindById(User.Identity.GetUserId()); 
var up = new UserProfileInfo {ImageSize = 12}; 
user.UserProfileInfo = up; 
UserManager.Update(user); 

更多關於EF流利的映射在這裏:https://msdn.microsoft.com/en-us/data/hh134698.aspx

編輯: 分配一個UserProfileInfo到ApplicationUser你既可以:

// get user via UserManager 
var user = UserManager.FindById(User.Identity.GetUserId()); 
// create new UserProfileInfo 
var up = new UserProfileInfo {ImageSize = 12}; 
// assign UserProfileInfo to user, ef will figure out that this info goes into the corresponding UserProfileInfo table 
user.UserProfileInfo = up; 
// update via UserManager 
UserManager.Update(user); 

或2

// logged in user id 
var userId = User.Identity.GetUserId(); 
using (var db = new ApplicationDbContext()) 
{ 
    // get user from context 
    var user = db.Users.First(c => c.Id == userId); 
    // new UserProfileInfo 
    var up = new UserProfileInfo {ImageSize = 12};' 
    // assign UserProfileInfo to user 
    user.UserProfileInfo = up; 
    // save changes 
    db.SaveChanges(); 
} 

最後,如果你想userprofileinfo,而不是總是創建一個新的更新。你可以做這樣的:

// get existing or create new UserProfileInfo 
var up = user.UserProfileInfo ?? new UserProfileInfo(); 
// update with new values 
up.ImageSize = 17; 

注意,你不需要關心外鍵ApplicationUser_Id,EF人物這一點本身當你將UserProfileInfo到ApplicationUser。

並且:如果您絕對要在UserProfileInfo中公開ApplicationUser的外鍵。您可以在類UserProfileInfo中添加名爲ApplicationUserId的屬性。按照慣例Ef理解這一點。如果您需要此外鍵的不同名稱,則可以使用.HasForeignKey(fk => fk.YourForeignKeyPropertyHere)

+0

擴展您的流暢映射,非常感謝您的答覆。它在名爲ApplicationUser_Id的數據庫中創建了一個外鍵。現在,當我嘗試上傳圖片時,它不會保存回數據庫中。我認爲問題是由FK創建的。實體框架不知道該放什麼。如何解決bro.i已經在這裏上傳代碼http://pastebin.com/ZWR2N4ZD – duke

+0

通過做用戶= UserManager.FindById找到登錄的用戶,你可以做我的答案上面(設置userprofileinfo UserManager.Update)。如果你像在你的例子中那樣通過dbcontext去,你首先必須獲取用戶(var user = dc.Users.First(c => c.Id == someUserId);)然後設置userprofile(user.UserProfileInfo = x )。最後是cs.SaveChanges。如果按照其他方式完成,請設置UserProfile的用戶(IG.ApplicationUser = someuser)。請注意,您的代碼只支持一個上傳pr用戶,您可能希望將其更改爲獲取用戶,檢查信息是否存在 - >更新或添加 – Indregaard

+0

var user = UserManager.FindById(User.Identity.GetUserId()); var user1 = dc.Users.First(c => c.Id == user.Id);現在,如何將該user1保存在數據庫FK列ApplicationUser_Id中。我認爲問題是外鍵是在數據庫中飛行創建的,我無法通過上面創建的UserProfileInfo實例獲得該屬性,如IG.FileName或IG.ImageSize – duke