我正在try 转换一个字段的方式从数据库,也在它的方式到数据库.棘手的部分是,我想使用一列中的数据来影响另一列中的数据.

当我硬编码一些所需的信息时,这对我来说是成功的,但我想使用另一个专栏中的信息作为转换过程的一部分.这有可能吗?我想在转换中在相同的上下文中使用数据服务--但它需要行主键,并且可能使它为结果的每条记录执行额外的查询--而且我甚至不能让它工作.任何 idea 都很棒,谢谢你抽出时间来!

// This works:
var converter1 = new ValueConverter<DateTime, DateTime>(
            from => MyClass.MyFromMethod(from, "my static text"),
            to => MyClass.MyToMethod(to, "my other static text")
        );

// This does NOT work:  (I want to replace the static text above with somehow getting data from a different column in same row here)
var converter2 = new ValueConverter<DateTime, DateTime>(
            from => MyClass.MyFromMethod(from, entity.Property(e => e.OtherColumn).SomehowGetValue()),
            to => MyClass.MyToMethod(to, entity.Property(e => e.OtherColumn).SomehowGetValue())
        );

// called like this:
modelBuilder.Entity<MyTable>(entity =>
        {
            entity.ToTable("MyTable");
            entity.HasIndex(e => e.MyIdColumn, "MyIndex");
            //generated code here..
            entity.Property(e => e.MyDateColumn).HasColumnType("datetime")
                .HasConversion(converter1); //switching to converter2 ideally!
            //more generated code here..

推荐答案

Value Conversions的第limitations section位开始:

目前无法将一个属性的转换扩展到多个列,反之亦然

因此,目前还不支持您正在try 做的事情.

在过go ,对于低影响场景或一次性实用程序,我所做的是在我的模型中有一个执行转换的未映射属性.

public class Foo
{
    public int FooId { get; set; }
    public int NeedsConversion { get; set; }
    public int ConvertInfo { get; set; }

    [NotMapped]
    public int DependsOnConversion
    {
        get
        {
            return DoConvert(this.NeedsConversion, this.ConvertInfo);
        }
        set
        {
            this.NeedsConversion = DoConvertBack(value, this.ConvertInfo);
        }
    }
}

接下来的部分只是我个人的观点,会有不同意见的人…

当我设计数据库时,我倾向于认为那是一个相当于stupid的存储层,其唯一目的是以一种保存和持久的方式存储数据.这raw个数据是由我所说的business logic layer处理的.

通常,转换依赖于某种类型的business rule(例如:If this value equals 101 we have to factor in 102 to the final value).我不希望我的storage layer有这样的知识(这种类型的东西在business layer中).我个人只允许在stroage layer中进行小的原子转换(build-in个转换器就是我所说的small and atomic的例子).所有比这更复杂的东西都放在business layer的内部(或者是从business layerstorage layertranslatesstorage layer的中间).

我的方法看起来像这样:

/// The model class that is mapped by EF core
public class FooStorage
{
    public int FooId { get; set; }

    public int Bar { get; set; }

    public int Baz { get; set; }
}

public class StroageToBusiness
{
    public FooBusiness Convert(FooStorage storage)
    {
        return new FooBusiness
        {
            //Management tole me I have to multiply by this magic 42
            CalculatedFooBar = storage.Bar + stroage.Baz * 42
        };
    }
}

/// The business object 
public class FooBusiness
{
    public int CalculatedFooBar { get; set; }
}

这样我们就能把stroage logic人和business logic人分开

Csharp相关问答推荐

为什么Microsoft.AspNetCore. htttp.FormFile不实现IDDisposable?

Inbox RandomizedStringHashAl算法如何帮助抵御哈希洪泛攻击?

C#如何克服getter的接口空性

VS Code - C# - dotnet run找不到文件,但我可以打开并编辑它们吗?

有没有办法把+02:00转换成TimeSpan?""

找不到网址:https://localhost:7002/Category/Add?区域= Admin.为什么我的URL是这样生成的?area = Admin而不是/Admin/

Blazor. NET 8—阶段启动配置文件不启动网站VS2022

选取器与.NET Maui MVVM的绑定属性

C#.NET依赖项注入顺序澄清

如何使用MoQ模拟Resources GroupCollection?

N层解决方案上的依赖注入-删除样板

如何将端点(或с匹配请求并判断其路径)添加到BCL?

该函数不能检测两条曲线的交点

如何在同一成员上组合[JsonPropertyName]和[ObservableProperty]?

如何从Azure函数使用Graph API(SDK 5.35)中的[FindMeetingTimes]

如何在Polly重试策略成功之前将HttpClient请求排队?

C#无法将.csv列转换为用于JSON转换的列表

如何在C#中从MongoDB IPipelineStageDefinition中获取聚合命令的字段/选项?

为什么我在使用有效令牌的情况下仍未获授权?

外部应用&&的LINQ;左外部连接&类似于PostgreSQL的查询