繁体   English   中英

实体框架数据建模:2个外键和一个主键

[英]Entity Framework data modelling: 2 foreign keys and a primary key

我有以下表格:

public class Event {
  public int Id {get;set;}
}

public class Participant{
  public int Id {get;set;}
}

public class Registration{
  public int Id {get;set;}
  public int EventId {get;set;}
  public int PaticipantId {get;set;}
}

我将注册ID作为主键,但是如何确保eventid和particpantid是唯一的? 我已经考虑过复合键,但是我需要在注册时使用Id属性,因为我需要将其作为另一个类/表上的外键。

对于任何对我的dbcontext感到好奇的人,它是这样的:

modelBuilder.Entity<Registration>()
                .HasRequired(e => e.Participant)
                .WithMany(u => u.Events)
                .HasForeignKey(e => e.ParticipantId);

            modelBuilder.Entity<Registration>()
                .HasRequired(e => e.Event)
                .WithMany(u => u.Participants)
                .HasForeignKey(e => e.EventId);

创建另一个包含EventId和PaticipantId作为复合键的表,然后将该表ID放入您的Registration表中。

public class Event {
  public int Id {get;set;}
}

public class Participant{
  public int Id {get;set;}
}

public class NewTable{
   public int Id {get;set;}
   public int EventId  {get;set;}
   public int PaticipantId {get;set;}
}

public class Registration{
  public int Id {get;set;}
  public int NewTableId {get;set;}
}

实际上,有很多方法可以确保EventId和PaticipantId的组合是唯一的,甚至可以不接触模型。

可以在您的数据库中设置它:您可以声明两个字段UNIQUE的组合,然后在应用程序中捕获错误并根据需要进行处理。

您还可以使用检查组合是否存在的函数直接在应用程序内部进行验证。 (如果存在,则返回false)

您还可以在模型中添加ANOTHER字段,该字符串代表相同字段中的两个ID,并声明其唯一性

实际上,有很多解决方案可以解决您的问题...选择对自己更轻松的解决方案。

您应该在EventId和ParticipantId列的组合上添加唯一键

由于您正在使用EF迁移,因此可以将唯一键添加到模型中,然后让Entity Framework为您生成新的迁移。 然后,此迁移将向数据库添加唯一密钥。 取决于您的实体框架版本,这将有所不同。

在Entity Framework Core 1.0.0中,这很简单:

modelBuilder.Entity<Registration>().HasIndex(x => new { x.ParticipantId, x.EventId}).IsUnique();

使用Entity Framework 6时,可以使用批注或流利的api(尽管很冗长):

带有注释:

public class Registration
{
  public int Id {get;set;}
  [Index("UQ_Registration_EventId_ParticipantId", 1, IsUnique = true)]
  public int EventId {get;set;}
  [Index("UQ_Registration_EventId_ParticipantId", 2, IsUnique = true)]
  public int PaticipantId {get;set;}
}

或使用流畅的API:

string uniqueIndex = "UQ_Registration_EventId_ParticipantId";

modelBuilder.Entity<Registration>().Property(t => t.EventId)
    .HasColumnAnnotation(
        IndexAnnotation.AnnotationName,
        new IndexAnnotation(
            new IndexAttribute(uniqueIndex)
            {
                IsUnique = true,
                Order = 1
            }
        )
    );

modelBuilder.Entity<Registration>().Property(t => t.ParticipantId)
    .HasColumnAnnotation(
        IndexAnnotation.AnnotationName,
        new IndexAnnotation(
            new IndexAttribute(uniqueIndex)
            {
                IsUnique = true,
                Order = 2
            }
        )
    );

暂无
暂无

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

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