繁体   English   中英

Entity Framework 5.0代码优先方法中的一对一关系

[英]One to one relationship in Entity Framework 5.0 Code First Approach

我想发展两个实体之间的关系。 两个实体都具有一对一的关系,并且两个实体都具有导航属性,这意味着我可以访问实体,然后访问具有导航属性的另一个关联实体。 让我们来看一个例子。

假设我有两个实体,例如User和UserProfile。 每个用户只有一个配置文件,一个用户配置文件只有一个用户。 我可以从类似User.UserProfile的用户访问User Profile,也可以从类似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表的主键和功能键,但是如何在User Entity中为User Profile定义导航属性?

这是对此建模的最佳方法。 我修剪了基类和其他不相关的配置,只是为了获得如何配置required:required关系的核心。 正如您在问题中提到的,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);
    }
}

我不确定如何使用流畅的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; }
    }
}

注意:如果这样做有帮助,您不要忘记将其标记为答案并投票:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM