【问题标题】:mvc entity framework model: a primary key and 2 more keys issuemvc实体框架模型:一个主键和另外2个键问题
【发布时间】:2012-04-26 14:14:33
【问题描述】:

所以我有以下型号

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 的记录。

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

【问题讨论】:

  • 当您可以使用复合 PK 时,为什么要为 UserApointment 维护 Id 列。
  • 将在另一个与 UserAppointment 具有一对多关系的表上使用它。我觉得它更容易查询?

标签: asp.net-mvc entity-framework entity-framework-4 foreign-keys composite-key


【解决方案1】:

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

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

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

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

阅读更多here.,特别是备注:

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

更新

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

CREATE UNIQUE INDEX IX_UserAppointment
ON UserAppointment (UserId, AppointmentId)

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

【讨论】:

  • 我在某些脚本上看到了第一个选项,但并没有完全理解它。让我快速尝试第二个。谢谢!
  • 第二个成功了!我很确定第一个也会。你会推荐哪一个?总之感谢!编辑:好的,等一下。第二个有问题,ID 失去了它的主键状态。它不会产生价值。窝。也许,我用了第一个
  • 我很高兴它成功了。我会将约束添加到数据库中。这将负责维护任何应用程序的数据完整性,而不仅仅是您的。
  • @gdubs 是的,您仍然会在该表上拥有 Id 列,因为您将它链接到其他表,即使您可能使用两列(用户 ID、约会 ID)链接它我更喜欢使用单列 (id)。
  • 如果它在 SSMS 中显示“非唯一”,那么您没有创建唯一索引,我可以看到原因:我忘了在我的答案中加上“唯一”(抱歉,我刚刚更新了我的回答再次)。删除您创建的索引并使用CREATE UNIQUE INDEX IX_UserAppointment ON UserAppointment (UserId, AppointmentId) 重新创建它。为了删除索引,只需在 SSMS 中选择它,右键单击并选择“删除”。
猜你喜欢
  • 2014-08-06
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多