Использование одного и того же внешнего ключа в двух отношениях с использованием Entity Framework Core - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть две таблицы 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 без необходимости какой-либо логики ввнешний интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...