У меня есть две таблицы Event и EventRegistration.EventRegistration может быть либо обычной регистрацией, либо регистрацией в списке ожидания.
Попытка создать два атрибута для события (List<Registration> Registrations and List<Registration> Waitlist
) вызывает исключение «В типе объекта« Событие »существует несколько переходов, которые указывают на одно и то женабор свойств - EventId с использованием ForeignKeyAttribute. "
Это проект миграции, в котором базе данных уже более десяти лет.В нем есть много недостатков, которые нужно исправить, но мне нужно выбрать то, что абсолютно необходимо исправить, иначе можно подождать.
Я пытался реализовать внешний ключ несколькими способами в MSSQL, делая это вручную или запутывая егов меру своих возможностей.Кажется, что большинство попыток не работают, с одним решением, заставляющим слишком много бизнес-логики переднему краю.
Я пытался сохранить код / схему в этом вопросе как можно более экономным.Некоторые автоматически генерируются из Scaffold-DbContext, а некоторые добавляются вручную.
public partial class Event
{
public int EventId { get; set; }
public string EventTitle { get; set; }
public string Presenters { get; set; }
public int? Deleted { get; set; }
private List<EventRegistration> _registrations;
public Event()
{
EventsDataContext db = new EventsDataContext( );
_registrations = db.EventsRegistrations.Where( er => er.EventId == this.EventId && er.Deleted == 0 ).ToList( );
}
[ForeignKey("EventId")]
public List<EventRegistration> Registrations
{
get
{
return _registrations.Where( w => w.Waitlist == 0 ).ToList( );
}
}
[ForeignKey( "EventId" )]
public List<EventRegistration> Waitlist
{
get
{
return _registrations.Where( w => w.Waitlist == 1 ).ToList();
}
}
}
public partial class EventRegistration
{
public int RegistrationId { get; set; }
public int? MemberId { get; set; }
public int EventId { get; set; }
public int? Deleted { get; set; }
public int? Waitlist { get; set; }
public Event Event { get; set; }
}
public partial class EventsDataContext: DbContext
{
public virtual DbSet<Event> Events { get; set; }
public virtual DbSet<EventRegistration> EventsRegistrations { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Event>(entity =>
{
entity.HasKey(e => e.EventId).HasName("PK_EventsCalendar");
entity.Property(e => e.EventId).HasColumnName("EventID");
entity.Property(e => e.Deleted).HasDefaultValueSql("((0))");
entity.Property(e => e.Presenters).HasMaxLength(250);
});
modelBuilder.Entity<EventRegistration>( entity =>
{
entity.HasKey( e => e.RegistrationId ).HasName( "PK_EventRegistrations" );
entity.Property( e => e.RegistrationId ).HasColumnName( "RegistrationID" );
entity.Property( e => e.Deleted ).HasDefaultValueSql( "((0))" );
entity.Property( e => e.EventId ).HasColumnName( "EventID" );
entity.Property( e => e.MemberId ).HasColumnName( "MemberID" );
entity.Property( e => e.Waitlist ).HasDefaultValueSql( "((0))" );
entity.HasOne( field => field.Event ).WithMany( fk => fk.Registrations ).HasForeignKey( fk => fk.EventId ).HasConstraintName( "RegEvent_FK" );
entity.HasOne( field => field.Event ).WithMany( fk => fk.Waitlist ).HasForeignKey( fk => fk.EventId ).HasConstraintName( "WaitListEvent_FK" );
} );
}
}
Возможность использовать объект Event для получения регистраций Non-Waitlist и / или регистраций Waitlist без необходимости какой-либо логики ввнешний интерфейс.