EF Core многие ко многим выпускают двойные типы - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь настроить многие ко многим с дополнительными свойствами в EF Core 2.2.После прочтения мне кажется, что я должен сделать свой стол для общения первоклассным гражданином.Я сделал это, но генерируемая им схема не совсем верна.Он добавляет нежелательное теневое свойство с именем «UserId1».

Вот модель домена:

User.cs

 public class User : IdentityUser<long> {

        public string FirstName { get; set; }

        public string LastName { get; set; }
        public IList<UserJobRecommendations> RecommendedJobs { get; protected set; 
}

Job.cs

public class Job : BaseEntity<Job> {
    public long Id { get; protected set; }        
    public string Name {get ; protected set;}
    public IList<UserJobRecommendations> RecommendedTo { get; protected set; }
}

UserJobRecommendations.cs

public class UserJobRecommendations {
    public Job Job { get; protected set; }

    public long JobId { get; protected set; }
    public User User { get; protected set; }

    public long UserId { get; protected set; }

    public long RecommendedById { get; protected set; }
    public User RecommendedBy { get; protected set; }
    }

Наконец, вот мой контекст:

public class MyContext : IdentityDbContext<User, IdentityRole<long>, long> {
        public DbSet<Job> Jobs { get; set; }    
        public DbSet<UserJobRecommendations> UserJobRecommendations { get; set; }


        protected override void OnModelCreating(ModelBuilder modelBuilder) {            

            modelBuilder.Entity<UserJobRecommendations>().HasKey(k => new { k.UserId, k.JobId });

            modelBuilder.Entity<UserJobRecommendations>().HasOne(x => x.User).WithMany(x=>x.RecommendedJobs);
            modelBuilder.Entity<UserJobRecommendations>().HasOne(x => x.RecommendedBy);

            modelBuilder.Entity<User>().HasMany(x => x.RecommendedJobs);
            modelBuilder.Entity<Job>().HasMany(x => x.RecommendedTo);



            modelBuilder.Seed();
            base.OnModelCreating(modelBuilder);
        }

Вот пример схемы, которую он создает для этого.Я не хочу userId1 собственность.Таблица должна иметь 3 свойства.JobId, UserId, RecommendedById.

  migrationBuilder.CreateTable(
                name: "UserJobRecommendations",
                columns: table => new
                {
                    JobId = table.Column<long>(nullable: false),
                    UserId = table.Column<long>(nullable: false),
                    UserId1 = table.Column<long>(nullable: true),
                    RecommendedById = table.Column<long>(nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_UserJobRecommendations", x => new { x.UserId, x.JobId });
                    table.ForeignKey(
                        name: "FK_UserJobRecommendations_Jobs_JobId",
                        column: x => x.JobId,
                        principalTable: "Jobs",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_UserJobRecommendations_AspNetUsers_RecommendedById",
                        column: x => x.RecommendedById,
                        principalTable: "AspNetUsers",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.Cascade);
                    table.ForeignKey(
                        name: "FK_UserJobRecommendations_AspNetUsers_UserId1",
                        column: x => x.UserId1,
                        principalTable: "AspNetUsers",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.Restrict);
                });

1 Ответ

0 голосов
/ 19 декабря 2018

Проблема в вашей Many-to-Many конфигурации объекта.Ваша Many-to-Many конфигурация между User и Job записана неправильно.

Напишите вашу конфигурацию сущности следующим образом:

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

    // Many-to-Many configuration between User and Job 
    modelBuilder.Entity<UserJobRecommendations>().HasKey(ujr => new { ujr.UserId, ujr.JobId });
    modelBuilder.Entity<UserJobRecommendations>().HasOne(ujr => ujr.User).WithMany(u=>u.RecommendedJobs)
                                                 .HasForeignKey(ujr => ujr.UserId).OnDelete(DeleteBehavior.Restrict);
    modelBuilder.Entity<UserJobRecommendations>().HasOne(ujr => ujr.Job).WithMany(j=>j.RecommendedJobs)
                                                 .HasForeignKey(ujr => ujr.JobId).OnDelete(DeleteBehavior.Restrict);

    // RecommendedBy ForeignKey Configuraiton
    modelBuilder.Entity<UserJobRecommendations>().HasOne(ujr => ujr.RecommendedBy).WithMany().HasForeignKey(ujr => ujr.RecommendedById);

    modelBuilder.Seed();

}

Теперь в Миграции все должно генерироваться как ожидалось!

...