#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; }
}
}
ПРИМЕЧАНИЕ: если это помогло, вы не забыли пометить его как ответ и проголосовать за него 🙂