我想在两个实体之间建立关系。两个实体都具有一对一的关系,并且两者都具有彼此的导航属性意味着我可以访问实体,然后访问具有导航属性的另一个关联实体。我们来看一个例子。
假设我有两个实体,如User和UserProfile。每个用户只有一个配置文件,一个用户配置文件只有一个用户。我可以从用户访问用户配置文件,如User.UserProfile,也可以从UserProfile访问User,如UserProfile.User。 我想在我的实体中实现上述场景,但没有得到解决方案。请建议您如何实现这一点。我的方法是首先在实体框架代码中实现一对一的关系。
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。映射UserProfiles以创建表
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实体中定义主键ID,UserId属性也是UserProfile表的主键和foeign键,但是如何在User Entity for User Profile中定义导航属性?
答案 0 :(得分: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);
}
}
答案 1 :(得分:0)
我不知道你怎么能用流畅的api做到这一点,但你可以做模型
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; }
}
}
注意:如果这有助于你不要忘记将其标记为答案并将其投票:)