Есть ли более элегантный способ указать несколько отношений одного и того же характера? - PullRequest
0 голосов
/ 20 января 2020

У меня проблемы с попыткой создать следующие отношения сущностей. Мой код имеет классы Shop и Person, и оба имеют несколько Phones. Моя первая реализация была примерно такой:

public class Person {
  public int Id;
  public string Name;
  public virtual ICollection<Phone> Phones;
}

public class Shop {
  public int Id;
  public string Name;
  public virtual ICollection<Phone> Phones;
}

public class Phone {
  public int Id;
  public string AreaCode;
  public string Number;

  public int? ShopId;
  public virtual Shop Shop;

  public int? PersonId;
  public virtual Person Person;
}

и конструктор моделей вроде

modelBuilder.Entity<Person>()
  .HasMany(p => p.Phones)
  .WithOptional(p => p.Person)
  .HasForeignKey(p => p.PersonId);

modelBuilder.Entity<Shop>()
  .HasMany(p => p.Phones)
  .WithOptional(p => p.Shop)
  .HasForeignKey(p => p.ShopId);

Я сомневаюсь здесь: могу ли я смоделировать это или изменить что-либо в моих классах, когда я ' Я не должен постоянно проверять, относятся ли они к Shop или Person?

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Чтобы добавить немного контекста к моему комментарию, я бы go о нем (с информацией, имеющейся в данный момент) мог бы выглядеть следующим образом:

  1. Я бы создал интерфейс , IMessageSender, у которого есть 1 метод: SendMessage(Phone destination).
  2. Пусть классы Shop и Person реализуют этот интерфейс. При реализации метода у вас будет логин c, который, исходя из комментариев, должен отличаться от Person и Shop.
  3. В том месте, куда вы хотите отправить сообщение, просто перебрать объект и вызвать SendMessage. Это, в свою очередь, делегирует логику c построения сообщения соответствующему классу.
0 голосов
/ 20 января 2020

Я бы предложил следующую схему:

public class Owner
{
  public int Id;
  public string Name;
  public virtual ICollection<Phone> Phones;
  public abstract SendMessage(Phone phone);
}

public class Person : Owner 
{
  public override SendMessage(Phone phone)
  {
   ...
  }

}
public class Shop : Owner 
{
  public override SendMessage(Phone phone)
  {
   ...
  }
}

public class Phone {
  public int Id;
  public string AreaCode;
  public string Number;

  public int? OwnerId;
  public virtual Owner Owner;
}

Таким образом, у вас нет двух сущностей с дублирующимися полями и, как упоминалось в npinti, вы делегируете функцию обмена сообщениями соответствующей сущности.

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