关系-EF核心

时间:2019-02-18 13:56:42

标签: c# .net entity-framework-core

我在进入EF核心关系方面遇到一些麻烦。

我不知道如何正确搜索它,所以我没有找到需要的东西,但是我找到了某个地方。

我有这两节课:

费用:

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;
        }
    }}

在ExpenseType中的ToListAsync期间,EF将“ expenseId”列添加到查询中,但是此列不存在。

我的数据库有三个表,每个表一个,关系一个。 (费用,费用类型和费用_费用类型)

通过在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 :(得分:0)

我认为您的主要问题是“我的想法是,我可以拥有一个ExpenseType而没有一个Expense,并且我可以拥有一个没有ExpeseType或有我想要的任意数量的Expense。”

因此您可以通过在Expanse类中创建可为空的外键ExpenseTypeId以及在ExpeseType类中创建Expanse的HashSet来实现。

赞:

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;}
}

答案 1 :(得分:0)

如果要创建多对多关系,则有几种选择方法:

  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");
         });
    

对于这种关系,您可以阅读更多here

但是在您的情况下,您不需要使用多对多。这就是为什么如果您不想在模型中添加属性ExpanseTypeIdExpenseId可以这样描述:

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
}

您要决定使用什么。如果您有一个想法,那就是费用有很多费用类型,而每种费用类型都有很多费用。您必须使用我所说的“多对多”。

相关问题