我在进入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映射吗?怎么样? 我应该重新写入数据库吗?
答案 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)
如果要创建多对多关系,则有几种选择方法:
按照您的描述创建其他类。在这种情况下,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; }
}
您可能不会创建类,而只是在上下文关系中进行描述。您将在此处描述所有内容,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
但是在您的情况下,您不需要使用多对多。这就是为什么如果您不想在模型中添加属性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
}
您要决定使用什么。如果您有一个想法,那就是费用有很多费用类型,而每种费用类型都有很多费用。您必须使用我所说的“多对多”。