use*_*383 10 c# entity-framework-core .net-core
我将尝试用一个过于简单的例子来说明我的问题:想象一下我有一个这样的域实体:
public class Box
{
public int Id { get; set; }
public int Height { get; set; }
public int Width { get; set; }
public int Depth { get; set; }
public int Volume => Height * Width * Depth;
}
Run Code Online (Sandbox Code Playgroud)
我正在根据其他所有属性进行计算(体积)。现在说我想使用 Entity Framework Core 存储这个类。当我保留实体时,有什么方法可以让 EF 核心将 Volume 的当前值存储在它自己的列中?
这是我的核心问题。我不允许分享我的实际代码,但这里有一些关于我的真实世界实体的更深入的信息(我们称之为“盒子”):
关于如何解决这个问题的一些想法:
public class Box
{
public int Id { get; set; }
public int Height { get; set; }
public int Width { get; set; }
public int Depth { get; set; }
public int Volume {
get => CalculateVolume();
private set => _volume = value; }
private int _volume;
private int CalculateVolume() => Height * Width * Depth;
}
Run Code Online (Sandbox Code Playgroud)
这似乎做我想做的事,但出于某种原因感觉像是在作弊,并污染了我的域实体。此外,我不确定这是否在所有情况下都有效,但在撰写本文时,这是我的首选解决方案。
我更希望能够使用 fluent API 来配置它。我注意到 PropertyBuilder.ValueGeneratedOnAdd() 方法描述说“该值可能由客户端值生成器生成,也可能由数据库作为保存实体的一部分生成。”,但我找不到任何示例客户端价值生成。
欢迎任何和所有合理的反馈。
编辑:只是为了澄清:实际计算非常复杂,并使用来自 7 个不同表的值。还涉及每个属性的权重。开头的 Box 示例过于简化,仅用于说明目的。我只想说,我需要在我的代码中保留计算。我只想存储结果。
您可以使用 Fluent api 在 sql server 上计算它
class MyContext : DbContext
{
public DbSet<Box> Box { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Box>()
.Property(p => p.Volume)
.HasComputedColumnSql("[Height] * [Width] * [Depth]");
}
}
Run Code Online (Sandbox Code Playgroud)
以下是我从 EF 人员那里得到的针对同一问题的回复:
从 EF Core 3.0 开始,EF 会在可能的情况下直接读取和写入支持字段。EF 可以配置为使用该属性,此时将从该属性读取计算值并因此写入数据库:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<Box>()
.Property(e => e.Volume)
.UsePropertyAccessMode(PropertyAccessMode.Property);
}
Run Code Online (Sandbox Code Playgroud)
或者
modelBuilder.UsePropertyAccessMode(PropertyAccessMode.PreferFieldDuringConstruction);
Run Code Online (Sandbox Code Playgroud)
阅读更多:https : //docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/break-changes#backing-fields-are-used-by-default
归档时间: |
|
查看次数: |
5963 次 |
最近记录: |