0

所以我有以下型号

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
 }

public class Appointment
{
    public int Id { get; set; }
    public string Name{ get; set; }
}

我希望将它们分配给另一个具有单独主键的表,如下所示

public class UserAppointment
{
    public int Id { get; set; }
    public int UserId { get; set; }
    public int AppointmentId { get; set; }

    public virtual Appointment Appointment {get;set;}
    public virtual User User {get;set;}
 }

我想要的是 Id 是一个键(唯一、自动生成等),同时将强制 UserId 和 AppointmentId 也具有唯一的组合。

eg
this is what i want
  Id         UserId          AppointmentId
  1            1                  2
  2            1                  3

and not this
  Id         UserId          AppointmentId
  1            1                  2
  2            1                  2
  3            1                  2

目前我在我的上下文中做了一些模型构建器语句来配置我的键

modelbuilder.Entity<UserApointment>()
  .HasRequired(e => e.User)
  .HasMany(u => u.Appointment)
  .HasForeignKey(e => e.UserId);

modelbuilder.Entity<UserApointment>()
  .HasRequired(e => e.Appointment)
  .HasMany(u => u.Users)
  .HasForeignKey(e => e.AppointmentId);

但它仍然可以让我插入具有相似用户和约会 ID 的记录。

非常感谢任何有关如何处理此问题的建议!谢谢!!

4

1 回答 1

1

您可以通过简单地在 UserAppointment 表上创建唯一约束来解决数据库级别的问题。

ALTER TABLE UserAppointments
ADD CONSTRAINT uc_UserAppointment UNIQUE (UserID,AppointmentID)

在实体框架(我不熟悉)上似乎是这样完成的:

modelbuilder.Entity<UserApointment>().HasKey(x=> new { x.UserId,x.AppointmentId});

在这里阅读更多,特别是备注:

如果主键由多个属性组成,则指定包括属性的匿名类型。例如,在 C# 中 t => new { t.Id1, t.Id2 }

更新

可能唯一索引更适合您的目的:

CREATE UNIQUE INDEX IX_UserAppointment
ON UserAppointment (UserId, AppointmentId)

此唯一索引将确保表中永远不会存在 UserId 和 AppointmentId 的重复组合,并且还将加快您的查询速度。

于 2012-04-26T14:24:50.233 回答