[英]Entity Framework Core model with abstract class
I have a question 我有个问题
I make a Code First Database In ASP .NET Core 2.1
and Entity Framework 2.1.1
. 我在
ASP .NET Core 2.1
和Entity Framework 2.1.1
创建了代码优先数据库。 For now, im in a planning step and i have one question. 现在,我正在计划中,我有一个问题。 I want to have a list of instance of abstract worker's class with method, that will work difrently.
我想要一个带有方法的抽象工作者类实例的列表,该列表可以不同地工作。 My code:
我的代码:
I have a Farm
: 我有一个
Farm
:
public class Farm
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public virtual List<Farmer> Farmers { get; set; } //my problem
public virtual List<Driver> Drivers { get; set; } //starts here!
}
In Farm instance i have Workers. 在农场实例中,我有工人。 I made an
abstract class
for it: 我为此做了一个
abstract class
:
public abstract class Worker
{
[Key]
public int Id { get; set; }
[ForeignKey("Farm")]
public int FarmId { get; set; }
public Farm Farm { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public float UsdPerHour { get; set; }
public int HoursPerDay { get; set; }
public int DaysOfWork { get; set; }
public abstract float CountSalary();
}
Worker can be a Driver
or a Farmer
: 工人可以是
Driver
或Farmer
:
public class Farmer : Worker
{
public float UsdPerHour = 9;
public int HoursPerDay = 8;
public int DaysOfWork = 20;
// CountSalary() here, but in diffrent way!
}
public class Driver : Worker
{
public float UsdPerHour = 10;
public int HoursPerDay = 7;
public int DaysOfWork = 18;
// CountSalary() here, but in diffrent way!
}
And my FarmDbContext
: 和我的
FarmDbContext
:
public class FarmDbContext : DbContext
{
public FarmDbContext(DbContextOptions<FarmDbContext> options) : base(options) { }
public DbSet<Farm> Farms { get; set; }
//public DbSet<Worker> Workers { get; set; }
public DbSet<Farmer> Farmers { get; set; } // What to do here?
public DbSet<Driver> Drivers { get; set; } // Let Farmers and Drivers
// Or Workers?
}
In My farm
i have two kinds of workers. 在我的
farm
我有两种工人。 For each "Position" i want to count salary in diffrent way. 对于每个“职位”,我想以不同的方式计算薪水。
What i want to do in code: 我想在代码中做什么:
var Workers = List<Worker>
Workers.Add(New Driver());
Workers.Add(new Farmer()):
foreach(object o in Workers)
int salary = o.CountSalary()
// i know that code is wrong, but i describe the way that i want to achive my goal
Could you explain me, how to plan my DbContext
to achive, what i want to? 您能给我解释一下,如何计划我的
DbContext
实现,我想要什么? Farmer
and Driver
need to have hard-coded values of propertys. Farmer
和Driver
需要具有属性的硬编码值。 When i let DbContext
like above in my code, i get two tables, dbo.Drivers
and dbo.Farmers
. 当我在代码中让
DbContext
像上面一样时,我得到了两个表dbo.Drivers
和dbo.Farmers
。 If it will work in a way that i explained above? 如果它能以我上面解释的方式工作? Is it possible in EF to block that hardcoded value in database and have it in every record of data i tables?
在EF中是否有可能阻止该硬编码的值在数据库中并将其保存在表的每个数据记录中?
Your Farmer
and Driver
classes have no new properties, just some constants for calculations. 您的
Farmer
和Driver
类没有新属性,只有一些用于计算的常量。 That is not the Model/Database layer's concern, it's the Services layer job. 与模型/数据库层无关,这是服务层的工作。
My Suggestion: 我的建议:
public enum WorkerType
{
Farmer,
Driver
}
Worker Class: 工人阶级:
public class Worker
{
[Key]
public int Id { get; set; }
[ForeignKey("Farm")]
public int FarmId { get; set; }
public Farm Farm { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public WorkerType WorkerType {get; set; } // assuming a worker can only be a Farmer or a Driver
}
DbContext: 的DbContext:
public class FarmDbContext : DbContext
{
public FarmDbContext(DbContextOptions<FarmDbContext> options) : base(options) { }
public DbSet<Farm> Farms { get; set; }
public DbSet<Worker> Workers { get; set; }
}
And then you can have a service or extension method that calculates the salary, for example: 然后,您可以使用一种服务或扩展方法来计算薪水,例如:
public static class WorkerExtensions
{
public static float Salary(this Worker worker)
{
switch(worker.WorkerType)
{
case WorkerType.Farmer:
//calculate and return
case WorkerType.Driver:
//calculate and return
default:
return -1;
}
}
}
Now you can get workers salary: 现在您可以获得工人薪水:
foreach(var worker in Workers)
var salary = worker.Salary();
The problem here is that every time your calculation constants change you need to change code and rebuild/republish. 这里的问题是,每次您的计算常量更改时,您都需要更改代码并重新生成/重新发布。 For that you can create a wage info table in your database and get those informations from there, and you can change them whenever you want.
为此,您可以在数据库中创建工资信息表并从中获取这些信息,并且可以随时更改它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.