Взаимно однозначное отношение в Entity Framework 5.0 Первый подход к кодированию

#c# #entity-framework #entity

#c# #entity-framework #сущность

Вопрос:

Я хочу разработать отношения между двумя объектами. Оба объекта имеют взаимно однозначное отношение, и оба имеют свойство навигации друг для друга, что означает, что я могу получить доступ к объекту, а затем получить доступ к другому связанному объекту с помощью свойства навигации. Давайте посмотрим пример.

Предположим, у меня есть две сущности, такие как User и UserProfile. У каждого пользователя есть только один профиль, а у одного профиля пользователя есть только один пользователь. Я могу получить доступ к профилю пользователя из user, например User.UserProfile, а также получить доступ к пользователю из UserProfile, например UserProfile.User. Я хочу реализовать описанный выше сценарий в своих сущностях и не получил решения. Пожалуйста, предложите свою мысль, как я могу этого добиться. Мой способ заключается в том, чтобы сначала реализовать взаимно однозначное отношение в коде entity framework.

1. Создайте базовую сущность

 using System;        
namespace Ioc.Core
{
  public abstract  class BaseEntity<T> where T: struct
    {
      public T ID { get; set; }
      public DateTime AddedDate { get; set; }
      public DateTime ModifiedDate { get; set; }
      public string IP { get; set; }
    }
}
  

2. Создайте пользовательскую сущность

 using System;    
namespace Ioc.Core.Data
{
   public class User : BaseEntity<Guid>
    {
       public string UserName { get; set; }
       public string Email { get; set; }
       public string Password { get; set; }      
    }
}
  

3. Создайте объект профиля пользователя

 using System;
namespace Ioc.Core.Data
{
  public class UserProfile : BaseEntity<int>
    {
      public string FirstName { get; set; }
      public string LastName { get; set; }
      public string Address { get; set; }
      public Guid UserId { get; set; }
      public virtual User User { get; set; }
    }
}
  

4. Сопоставление пользователя для создания таблицы

 using System.Data.Entity.ModelConfiguration;
using Ioc.Core.Data;
namespace Ioc.Data.Mapping
{
   public class UserMap :EntityTypeConfiguration<User> 
    {
       public UserMap()
       {
           //key
           HasKey(t => t.ID);
           //properties
           Property(t => t.UserName).IsRequired();
           Property(t => t.Email).IsRequired();
           Property(t => t.Password).IsRequired();
           Property(t => t.AddedDate).IsRequired();
           Property(t => t.ModifiedDate).IsRequired();
           Property(t => t.IP);
           //table
           ToTable("Users");
       }
    }
}
  

5. Сопоставление пользовательских профилей для создания таблицы

 using System.Data.Entity.ModelConfiguration;
using Ioc.Core.Data;
namespace Ioc.Data.Mapping
{
   public class UserProfileMap : EntityTypeConfiguration<UserProfile>
    {
       public UserProfileMap()
       {
           //key
           HasKey(t => t.ID);
           //properties           
           Property(t => t.FirstName).IsRequired().HasMaxLength(100).HasColumnType("nvarchar");
           Property(t => t.LastName).HasMaxLength(100).HasColumnType("nvarchar");
           Property(t => t.Address).HasColumnType("nvarchar");
           Property(t => t.AddedDate).IsRequired();
           Property(t => t.ModifiedDate).IsRequired();
           Property(t => t.IP);
           //table
           ToTable("UserProfiles");
           //relation
           HasRequired(t => t.User).WithMany().HasForeignKey(t => t.UserId).WillCascadeOnDelete(false);
       }       
    }
}
  

Я думаю, что мне не нужно определять идентификатор первичного ключа в сущности UserProfile, а свойство userId будет также первичным ключом и чужим ключом для таблицы UserProfile, но как можно определить свойство навигации в сущности User для профиля пользователя?

Ответ №1:

Вот лучший способ смоделировать это. Я вырезал базовые классы и другую несвязанную конфигурацию, просто чтобы понять, как настроить требуемое: требуемое отношение. Как вы упомянули в своем вопросе, основной из UserProfile также служит внешним ключом для User .

 public class User
{
    public Guid UserId { get; set; }
    public string UserName { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }

    public UserProfile UserProfile { get; set; }
}

public class UserProfile
{
    public Guid UserId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }

    public virtual User User { get; set; }
}

public class UserProfileMap : EntityTypeConfiguration<UserProfile>
{
    public UserProfileMap()
    {
        HasKey(p => p.UserId);

        HasRequired(p => p.User).WithRequiredDependent(u => u.UserProfile);
    }
}
  

Ответ №2:

Я не уверен, как вы можете сделать это с помощью fluent api, но с помощью model вы можете сделать

 public class User : BaseEntity<Guid>
    {
       public string UserName { get; set; }
       public string Email { get; set; }
       public string Password { get; set; }      
       public virtual UserProfile userProfile { get; set;}
    }
}
3. Create User Profile Entity

using System;
namespace Ioc.Core.Data
{
  public class UserProfile : BaseEntity<int>
    {
      public string FirstName { get; set; }
      public string LastName { get; set; }
      public string Address { get; set; }
      public Guid UserId { get; set; }
      public virtual User User { get; set; }
    }
}
  

ПРИМЕЧАНИЕ: если это помогло, вы не забыли пометить его как ответ и проголосовать за него 🙂