实体框架5.0代码优先方法中的一对一关系

时间:2014-06-22 12:27:40

标签: c# entity-framework entity

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

假设我有两个实体,如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中定义导航属性?

2 个答案:

答案 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; }
    }
}

注意:如果这有助于你不要忘记将其标记为答案并将其投票:)