Отношения - EF Core - PullRequest
       4

Отношения - EF Core

0 голосов
/ 18 февраля 2019

У меня проблемы с установлением отношений с EF Core.

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

У меня есть два класса:

Расход:

public class Expense : Entity
{

    public string Title { get; set; }
    public string Description { get; set; }
    public decimal Amount { get; set; }
    public List<ExpenseType> Types { get; set; }
    public ValidationResult ValidationResult { get; private set; }

    public bool IsValid
    {
        get
        {
            var fiscal = new ExpenseIsValidValidation();
            ValidationResult = fiscal.Valid(this);
            return ValidationResult.IsValid;
        }
    }}

ExepenseType:

 public class ExpenseType : Entity
{
    #region properties
    public string Name { get; private set; }
    public string Description { get; private set; }
    public ValidationResult ValidationResult { get; private set; }
    public bool IsValid
    {
        get
        {
            var fiscal = new ExpenseTypeIsValidValidation();
            ValidationResult = fiscal.Valid(this);
            return ValidationResult.IsValid;
        }
    }}

Во время ToListAsync в ExpenseType EF добавляет столбец "CostId" кзапрос, но этот столбец не существует.

В моей базе данных есть три таблицы: одна для каждого класса и одна для связи.(Expense, ExpenseType и Expense_ExpenseType)

При поиске решения здесь, в StackOverflow, я обнаружил, что у меня должен быть класс для третьей таблицы.Вот оно:

 public class Expense_ExpenseType
{
    public int ExpenseId { get; set; }
    public Expense Expense { get; set; }
    public int ExpenseTypeId { get; set; }
    public ExpenseType ExpenseType { get; set; }
}

Моя идея заключается в том, что у меня может быть ExpenseType без Expense, и я могу иметь Expense без ExpeseType или с таким количеством, сколько я хочу.

Таким образом, ExpenseType не имеет никаких расходов.

Я не уверен, что мне теперь делать.Должен ли я использовать карту с помощью optionsBuilder?Как?Должен ли я переписать базу данных?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Если вы хотите создать отношение «многие ко многим», у вас есть несколько вариантов, как это сделать:

  1. Создать дополнительный класс, как вы описали.В этом случае EF создаст таблицу, и вы можете получить доступ к получению значений только из этой таблицы.

    public class Expense_ExpenseType
    {
       public int ExpenseId { get; set; }
       public Expense Expense { get; set; }
       public int ExpenseTypeId { get; set; }
       public ExpenseType ExpenseType { get; set; }
    }
    
  2. Вы не можете создавать класс и просто описывать его в контекстных отношениях.Где вы все опишите и EF самостоятельно создаст эту таблицу.Но из приложения вы не увидите эту таблицу.Вы должны использовать этот вариант, если не хотите расширять таблицу дополнительными полями.

     modelBuilder
       .Entity<Student>()
       .HasMany<Course>(s => s.Courses)
       .WithMany(c => c.Students)
       .Map(cs =>
         {
           cs.MapLeftKey("StudentRefId");
           cs.MapRightKey("CourseRefId");
           cs.ToTable("StudentCourse");
         });
    

Для этого отношения вы можете прочитать подробнее здесь

Но в вашем случае вам не нужно использовать «многие ко многим».Вот почему, если вы не хотите добавлять свойства ExpanseTypeId или ExpenseId в вашу модель, вы можете описать это так:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
   modelBuilder.Entity<Expense>()
     .HasMany<ExpenseType>(o => o.Types) //It is your list of expense types.
     .WithOne() //Here you can add model for expense. To have an option go back from expense type to expense
     .HasForeignKey("ForeignKey");//This key EF will create for you in DB but not in you app model
}

Что вы хотите использовать, вы должны решить.Если у вас есть представление, что у расхода много типов расходов, и у каждого типа расходов много расходов.Вы должны использовать «многие ко многим», как я описал.

0 голосов
/ 18 февраля 2019

Я думаю, что ваш главный вопрос: «Моя идея состоит в том, что я могу иметь ExpenseType без Expense, и я могу иметь Expense без ExpeseType или с любым количеством из них».

так что вы можете сделать это, создав обнуляемый внешний ключ ExpenseTypeId в классе Expanse и HashSet of Expanse в классе ExpeseType.

Как это:

public class ExpenseType : Entity
{
 public ICollection<Expanse> Expanses {get; set;} = new HashSet<Expanse>()
}

public class Expense : Entity
{
 public int? ExpanseTypeId {get; set;}
 public ExpanseType ExpanseType {get; set;}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...