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ステートメントを実行しました

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と予定IDを持つレコードを挿入することはできます。

これに対処する方法についてのアドバイスは大歓迎です!ありがとう!!

4

1 に答える 1

1

UserAppointmentテーブルに一意の制約を作成するだけで、データベースレベルでこれに取り組むことができます。

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

Entity Framework(私はよく知らない)では、次のように実行されているようです。

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 に答える