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, либо аннотаций данных.

я также пытался поставить отношения с помощью текучего 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); 
    } 

Таким образом, я также failed.Please предложить мне, как настроить его.

ответ

1

Вы почти находитесь. Во-первых, вы можете удалить все аннотации своих свойств (Key, foreignkey), так как ef по соглашению делает ваш столбец с именем Id основным ключом (и ваши отношения относятся к этому снова).

Во-вторых, вам нужно всего лишь бегло сопоставить отношения от одного объекта, например, от 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); 

Подробнее о эф беглых отображений здесь: https://msdn.microsoft.com/en-us/data/hh134698.aspx

EDIT: Чтобы Назначить 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.

И: если вы абсолютно хотите открыть внешний ключ для ApplicationUser в UserProfileInfo. вы можете добавить свойство с именем ApplicationUserId в класс UserProfileInfo. По соглашению Эф понимает это. Если вам требуется другое имя для этого внешнего ключа, вы можете расширить свое свободное отображение, используя .HasForeignKey (fk => fk.YourForeignKeyPropertyHere)

+0

хорошо спасибо за ответ ur.It создал внешний ключ в базе данных с именем ApplicationUser_Id. Теперь, когда я пытаюсь загрузить pic, он не сохраняется в базе данных. Я думаю, проблема связана с FK created.Entity framework не знает, что туда положить. как исправить, что bro.i загрузил код здесь http://pastebin.com/ZWR2N4ZD – duke

+0

, выполнив user = 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 column ApplicationUser_Id. Я думаю, проблема заключается в том, что внешний ключ создается на лету в базе данных, и я не могу добраться до этого свойства с помощью экземпляра UserProfileInfo, созданного выше, например IG.FileName или IG.ImageSize – duke

 Смежные вопросы

  • Нет связанных вопросов^_^