0

所以我有以下型号MVC实体框架模型:一个主键和2个键的问题

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); 

但它仍然让我插入带有类似的用户和任用IDS记录。

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

+0

当您可以使用复合PK时,为什么要维护'UserApointment'的'Id'列。 – Eranga 2012-04-26 14:20:06

+0

不适合在另一个与UserAppointment有一对多关系的表上使用它。我觉得它更容易查询? – gdubs 2012-04-26 14:31:15

回答

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 =>新{ t.Id1,t.Id2}

UPDATE

也许唯一索引服务的目的更好:

CREATE UNIQUE INDEX IX_UserAppointment 
ON UserAppointment (UserId, AppointmentId) 

这种独特的索引将确保表中不会存在UserId和AppointmentId的重复组合,并且还会加快查询速度。

+0

我在某些脚本上看到了第一个选项,并没有真正完全理解它。让我先快速尝试第二个。谢谢! – gdubs 2012-04-26 14:30:00

+0

第二个人工作!我很确定第一次也会。你会推荐哪一个?不管怎样,谢谢! 编辑:好举起。第二个有问题,Id失去了它的主要关键地位。它不会产生价值。 womp。也许,生病使用第一个 – gdubs 2012-04-26 14:41:08

+0

我很高兴它的工作。我会将约束添加到数据库。这将负责维护来自任何应用程序的数据完整性,而不仅仅是您的应用程序。 – Icarus 2012-04-26 14:42:29