0

У меня есть следующие таблицы:моделирования данных Entity Framework: 2 внешних ключей и первичный ключ

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

У меня есть регистрационный номер в качестве первичного ключа, но как убедиться, что 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); 
+1

Вы хотите, чтобы комбинация eventId и memberId была уникальной? Уникальный ключ в этих двух столбцах в базе данных гарантирует это, или это не то, что вы спросили? – HansVG

+0

Вы говорите о составных клавишах? Я думал об этом, но мне нужен отдельный уникальный идентификатор, кроме их комбинации как id. это то, что для Registration.Id. Но мне нужно убедиться, что EventId и MemberantId уникальны. – gdubs

+0

Ну, ваш регистрационный номер - ваш первичный ключ. По умолчанию postgres создаст уникальное ограничение для этого столбца. Затем вы добавляете уникальный ключ в столбцы EventId и ParticipantId поверх этого (в вашей базе данных https://www.postgresql.org/docs/9.6/static/indexes-unique.html.Таким образом, ваш registrationId уникален, и комбинация EventId, MemberantId также уникальна. Если вы используете миграции сущностей сущностей, вы можете указать в своем классе dbcontext, что вы хотите иметь уникальный ключ в этих двух столбцах и позволить Entity Framework генерировать миграцию для вас (или добавить их вручную для миграции) – HansVG

ответ

0

Создайте другую таблицу, содержащую EventId и PaticipantId в качестве составного ключа затем поместить этот идентификатор таблицы в вашей регистрации таблицы.

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;} 
} 
+0

Вы имели в виду идентификатор в NewTable? это похоже на регистрационную таблицу, если вы это сделаете. Мне понадобится Newtable, чтобы иметь уникальную комбинацию EventId и MemberantId. Предположим, что NewTable - это то, что есть. Как сделать этот составной ключ с идентификатором, который будет увеличивать каждую вставку? – gdubs

+0

Почему вам нужно сделать идентификатор регистрационной таблицы первым, потому что он будет увеличиваться каждый раз? – user3754008

+0

да, мне нужно, чтобы для отношения многих или многих к другой таблице, а также – gdubs

0

Существует actualy много способов, чтобы убедиться, что сочетание EVENTID и PaticipantId уникален или даже не прикасаясь к вашей модели.

Его можно установить в вашей БД: вы можете объявить комбинацию из двух полей UNIQUE, а затем поймать ошибку внутри вашего приложения и справиться с ней, как хотите.

Вы также можете проверить прямо внутри своего приложения с помощью функции, которая проверяет наличие комбинации. (Возвращение ложным, если оно существует)

Вы также можете добавить еще одно поле в вашей модели, строка, представляющая как идентификаторы в одних и тех же fiels, и объявить его уникальным

На самом деле, есть тонны решений для вашего проблема ... Выберите то, что вам легче.

0

Вы должны добавить уникальный ключ на комбинации столбцов EVENTID и ParticipantId

Поскольку вы используете EF миграции, вы можете добавить уникальный ключ к вашей модели и позволить Entity Framework генерировать новую миграцию для вас впоследствии. Затем эта миграция добавит уникальный ключ в вашу базу данных. В зависимости от вашей версии Entity Framework это будет отличаться.

В Entity Framework Ядро 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 
      } 
     ) 
    ); 
+0

ОК, это кажется простым, один вопрос tho, uniqueIndex, это то, что мне нужно генерировать самостоятельно? также будет ли автогенерация id? – gdubs

+0

Нет идентификатора с автогенератором. Единственный ключ - это просто ограничение, запрещающее появление повторяющихся комбинаций EventId и ParticipantId в таблице. У него нет самого идентификатора. Уникальные ограничения гарантируют, что данные, содержащиеся в столбце, или группа столбцов (в данном случае ваши два ключа внешнего ключа EventId и MemberantId), являются уникальными среди всех строк в таблице. – HansVG

 Смежные вопросы

  • Нет связанных вопросов^_^