Как мне исправить отношения один ко многим, когда одна сторона имеет два объекта одного типа - PullRequest
1 голос
/ 05 апреля 2019

Я работаю над проектом.Когда я только начинал, у меня была модель заказа и модель адреса.Теперь, однако, я хотел бы изменить модель заказа на AddressTo и AddressFrom вместо только Address.

Модель адреса:

public class Address
{
    public int AddressId { get; set; }
    public int ZipCodeId { get; set; }
    public string Street { get; set; }
    public int Nr { get; set; }
    public virtual ICollection<Order> Order { get; set; }
    public virtual ZipCode ZipCode { get; set; }
} 

Модель заказа:

public class Order
{   
    public int OrderId { get; set; }
    public int CustomerId { get; set; }
    public virtual Address Address { get; set; }
    public DateTime OrderDate { get; set; } 
    public DateTime SentDate { get; set; } 
    public string Title { get; set; }
    public string Type { get; set; }
    public string Content { get; set; }
    public int ExpectedHours { get; set; }
    public int AmountWorkers { get; set; }
    public virtual Customer Customer{ get; set; }
}

Что я хочу в заказе:

public class Order
{   
    public int OrderId { get; set; }
    public int CustomerId { get; set; }
    public virtual Address AddressTo { get; set; }
    public virtual Address AddressFrom { get; set; }
    public DateTime OrderDate { get; set; } 
    public DateTime SentDate { get; set; } 
    public string Title { get; set; }
    public string Type { get; set; }
    public string Content { get; set; }
    public int ExpectedHours { get; set; }
    public int AmountWorkers { get; set; }
    public virtual Customer Customer{ get; set; }
}

Я понял, что решениеэта проблема без FluentApi невозможна.Однако мне трудно преодолеть эту проблему.

Я хочу, чтобы моя таблица заказов в базе данных показывала столбцы идентификаторов AddressToId и AddressFromId, а не просто AddressId (вот какэто прямо сейчас).

Буду очень признателен за помощь сообщества по этому вопросу.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Сначала удалите public virtual ICollection<Order> Order { get; set; } свойство навигации из вашего Address класса модели следующим образом:

public class Address
{
    public int AddressId { get; set; }
    public int ZipCodeId { get; set; }
    public string Street { get; set; }
    public int Nr { get; set; }

    public virtual ZipCode ZipCode { get; set; }
}

Затем добавьте AddressFromId и AddressToId свойства к вашему Order классу модели следующим образом:

public class Order
{
    public int OrderId { get; set; }
    ..............
    public int AddressFromId { get; set; }
    public virtual Address AddressFrom { get; set; }

    public int AddressToId { get; set; }
    public virtual Address AddressTo { get; set; }

    ................
}

Затем ваша Order Конфигурация выглядит следующим образом:

public class OrderConfiguration : IEntityTypeConfiguration<Order>
{
    public void Configure(EntityTypeBuilder<Order> builder)
    {
        builder.HasOne(o => o.AddressFrom).WithMany().HasForeignKey(o => o.AddressFromId)
            .OnDelete(DeleteBehavior.Restrict);

        builder.HasOne(o => o.AddressTo).WithMany().HasForeignKey(o => o.AddressToId)
            .OnDelete(DeleteBehavior.Restrict);
    }
}

Затем в OnModelCreating из DbContext следующим образом:

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

     modelBuilder.ApplyConfiguration(new OrderConfiguration());  
}
0 голосов
/ 05 апреля 2019

Вы можете настроить его следующим образом:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  // ...
  modelBuilder.Entity<Order>().HasOne(x => x.AddressTo).WithMany(); //Add HasForeignKey, IsRequired... if you want
  modelBuilder.Entity<Order>().HasOne(x => x.AddressFrom).WithMany(); //Add HasForeignKey, IsRequired... if you want 
  //...
}

Но вам даже нужно, чтобы ваш Address был сущностью с идентификатором?Если нет, вы можете удалить из него свойства AddressId и Order и сделать его принадлежащим объектом объекта Order:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  // ...
  modelBuilder.Entity<Order>().OwnsOne(x => x.AddressTo);
  modelBuilder.Entity<Order>().OwnsOne(x => x.AddressFrom);
  //...
}

Обновление:Удалено отображение порядка

Вы можете удалить свойство Order из вашего Address класса и просто использовать .WithMany() без параметров в вашем отображении.

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