Entity framework 首先在实体框架代码中将两个不同表的主键映射到另一个表

Entity framework 首先在实体框架代码中将两个不同表的主键映射到另一个表,entity-framework,entity-framework-4,entity-framework-4.1,ef-code-first,code-first,Entity Framework,Entity Framework 4,Entity Framework 4.1,Ef Code First,Code First,我首先使用实体框架4.3.1代码。我的数据库中有两个表,列有它们的列名: 状态表: StatusID int Status varchar(50) RequestStatusID int RequestStatus varchar(50) RequestStatusID RequestStatus 1 RequestStatus1 2 RequestStatus2 3 Requ

我首先使用实体框架4.3.1代码。我的数据库中有两个表,列有它们的列名:

状态表:

StatusID int
Status varchar(50)
RequestStatusID int
RequestStatus varchar(50)
RequestStatusID     RequestStatus
1                   RequestStatus1
2                   RequestStatus2
3                   RequestStatus3
4                   RequestStatus4
StatusID            Status
1                   Status1
2                   Status2
3                   Status3
4                   Status4
请求状态表:

StatusID int
Status varchar(50)
RequestStatusID int
RequestStatus varchar(50)
RequestStatusID     RequestStatus
1                   RequestStatus1
2                   RequestStatus2
3                   RequestStatus3
4                   RequestStatus4
StatusID            Status
1                   Status1
2                   Status2
3                   Status3
4                   Status4
我有两门课:

public class Status : IEntity
{
     public int Id { get; set; }
     public string Name { get; set; }

     public RequestStatus RequestStatus { get; set; }
}

public class RequestStatus : IEntity
{
     public int Id { get; set; }
     public string Name { get; set; }

     public Status Status { get; set; }
}
我的数据库上下文类:

public class ICaseDbContext : DbContext
{
     public DbSet<Status> Statuses { get; set; }
     public DbSet<RequestStatus> RequestStatuses { get; set; }

     protected override void OnModelCreating(DbModelBuilder modelBuilder)
     {
          modelBuilder.Configurations.Add(new StatusConfiguration());
          modelBuilder.Configurations.Add(new RequestStatusConfiguration());
     }
}
状态表:

StatusID int
Status varchar(50)
RequestStatusID int
RequestStatus varchar(50)
RequestStatusID     RequestStatus
1                   RequestStatus1
2                   RequestStatus2
3                   RequestStatus3
4                   RequestStatus4
StatusID            Status
1                   Status1
2                   Status2
3                   Status3
4                   Status4
每个表的主键与另一个表中的主键匹配。因此,如果请求状态为RequestStatus1,则相应的状态必须为Status1。如果我的状态为Status3,则相应的请求状态必须为RequestStatus3

这可能吗


如何在EF中设置thtis我想您需要1:1的映射,因此两端都是必需的,使用Id作为键

这样更新配置将创建所需的表:

class StatusConfiguration : EntityTypeConfiguration<Status>
{
    internal StatusConfiguration()
    {
        this.ToTable("Statuses");
        this.Property(x => x.Id).HasColumnName("StatusID");
        this.Property(x => x.Name).HasColumnName("Status");

        this.HasRequired(x => x.RequestStatus)
            .WithRequiredPrincipal();

    }
}

class RequestStatusConfiguration : EntityTypeConfiguration<RequestStatus>
{
    internal RequestStatusConfiguration()
    {
        this.ToTable("RequestStatuses");
        this.Property(x => x.Id).HasColumnName("RequestStatusID");
        this.Property(x => x.Name).HasColumnName("RequestStatus");

        this.HasRequired(x => x.Status)
           .WithRequiredDependent();
    }
}
类状态配置:EntityTypeConfiguration
{
内部状态配置()
{
这是可更改的(“状态”);
this.Property(x=>x.Id).HasColumnName(“StatusID”);
this.Property(x=>x.Name).HasColumnName(“状态”);
this.HasRequired(x=>x.RequestStatus)
.WithRequiredPrincipal();
}
}
类RequestStatusConfiguration:EntityTypeConfiguration
{
内部RequestStatusConfiguration()
{
此.ToTable(“请求状态”);
this.Property(x=>x.Id).HasColumnName(“RequestStatusID”);
this.Property(x=>x.Name).HasColumnName(“RequestStatus”);
this.HasRequired(x=>x.Status)
.WithRequiredDependent();
}
}

谢谢,这对我很有用。只有两个问题。。EF如何知道映射2个主键?如果我想映射到其他两个字段而不是ID,那么代码会是什么样子?这是因为您正在设置RequiredDependant和RequiredPrincipal映射-通过设置这些映射,EF做出了所需的假设。如果您想映射到其他字段,您可以在fluent映射的末尾添加一个.map(m=>m.MapKey(“KeyName”)