Много-много и одно-много в одной коллекции Entity Framework 6 с InverseProeprty - PullRequest
0 голосов
/ 21 января 2019

У меня есть следующее:

public class Event : IEntity
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [JsonProperty("id")]
    public Guid Id { get; set; }

    [JsonProperty("description")]
    public string Description { get; set; }

    [JsonProperty("date")]
    public DateTimeOffset Date { get; set; }

    [JsonProperty("distance")]
    public int Distance { get; set; }

    [JsonProperty("verticalAscend")]
    public int VerticalAscend { get; set; }

    [ForeignKey("User")]
    [JsonProperty("userId")]
    public Guid UserId { get; set; }

    //attending
    public DateTimeOffset DateCreated { get; set; }
    public DateTimeOffset DateModified { get; set; }

    [JsonProperty("user")]
    public virtual User User { get; set; }
    [JsonProperty("comments")]
    public virtual ICollection<Comment> Comments { get; set; }
    [JsonProperty("attending")]
    public virtual ICollection<User> AttendingList { get; set; }
}

И:

public class User : IEntity
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [JsonProperty("id")]
    public Guid Id { get; set; }

    [JsonProperty("profilePicUrl")]
    public string ProfilePicUrl { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("surname")]
    public string LastName { get; set; }

    [JsonProperty("email")]
    public string Email { get; set; }

    public DateTimeOffset DateCreated { get; set; }
    public DateTimeOffset DateModified { get; set; }

    public virtual ICollection<Event> AttendingEvents { get; set; }
    [InverseProperty("User")]
    public virtual ICollection<Event> Events { get; set; }
}

Отношения:

Событие:

  • Много посещающих пользователей(AttendingList)

Пользователь:

  • Может присутствовать на многих мероприятиях (AttendingEvents)

  • Может создавать несколько событий (События)

Существует множество взаимосвязей между Event.AttendingList и User.AttendingEvents.Существует 0-много отношений между Event.User и User.Events, с ForeignKey в качестве UserId.

Я пытаюсь настроить их с помощью Fluent API и использую InverseProperty для настройки другой стороны отношения, возвращаясь к Event.User, но получая следующую ошибку:

Введение ограничения FOREIGN KEY 'FK_dbo.UserEvents_dbo.Events_Event_Id' в таблице 'UserEvents' может вызвать циклы или несколько каскадных путей.Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION, или измените другие ограничения FOREIGN KEY.

Я не уверен, как решить эту взаимосвязь для одной таблицы.Что я делаю не так?

1 Ответ

0 голосов
/ 21 января 2019

В DbContext настройте ваши модели следующим образом:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     base.OnModelCreating(modelBuilder);

     modelBuilder.Entity<Event>().HasRequired(e => e.User)
            .WithMany(u => u.Events)
            .HasForeignKey(e => e.UserId)
            .WillCascadeOnDelete(false);

     modelBuilder.Entity<User>()
            .HasMany<Event>(s => s.AttendingEvents)
            .WithMany(c => c.AttendingList)
            .Map(cs =>
            {
                cs.MapLeftKey("UserId");
                cs.MapRightKey("EventId");
                cs.ToTable("UserEvents");
            });
}
...