EF Core 脚手架数据和属性已更改

问题描述 投票:0回答:1

我有一个 WPF 应用程序(MVVM Toolkit),其数据模型是使用数据库中的 EFcore 工具搭建的。一个特定类别的最终模型如下所示:

public partial class BomLine
{
    public int Id { get; set; }
    public int ProjectId { get; set; }
    public string? Manufacturer { get; set; }
    public string? ManufacturerPartNumber { get; set; }

    public string? InternalPartNumberSelected { get; set; }
}

此类项目的列表

ObservableCollection<BomLine>
显示在
ListView
中。这按预期工作。
InternalPartNumberSelected
的值有一个额外的绑定,它为相应的线提供了不同的颜色。

现在,当

InternalPartNumberSelected
的值发生变化时,不会触发 PropertyChanged 事件(当然,没有
[ObservableProperty]
或其他显式的 RaisePropertyChanged 命令。

我现在可以将脚手架数据更改为

public partial class BomLine : ObservableObject
{
    public int Id { get; set; }
    public int ProjectId { get; set; }
    public string? Manufacturer { get; set; }
    public string? ManufacturerPartNumber { get; set; }

    [ObservableProperty] string? _internalPartNumberSelected;
}

这将使颜色变化可见,因为现在触发了属性更改事件并且重新评估了绑定。

然而,这似乎是一个糟糕的解决方案,因为它需要修改脚手架数据(这将被覆盖)。

这个问题有“正确”的方法吗?我正在使用 .net core 8 / efcore 8、WPF、MVVM 工具包。

wpf entity-framework-core observable mvvm-toolkit
1个回答
0
投票

您可以使用https://learn.microsoft.com/en-us/dotnet/communitytoolkit/mvvm/observableobject#wrapping-a-non-observable-model中介绍的方法将 EF 与视图模型分离。在你的情况下,它会是这样的:

public class BomLineViewModel : ObservableObject
{
    private readonly BomLine model;

    public BomLineViewModel(BomLine model)
    {
        this.model = model;
    }

    public int Id
    {
        get => model.Id;
        // no setter, Id is readonly
    }

    public int ProjectId
    {
        get => model.ProjectId;
        set => SetProperty(model.ProjectId, value, model, (m, v) => m.ProjectId = v);
    }

    public string? Manufacturer
    {
        get => model.Manufacturer;
        set => SetProperty(model.Manufacturer, value, model, (m, v) => m.Manufacturer = v);
    }

    public string? ManufacturerPartNumber
    {
        get => model.ManufacturerPartNumber;
        set => SetProperty(model.ManufacturerPartNumber, value, model, (m, v) => m.ManufacturerPartNumber = v);
    }

    public string? InternalPartNumberSelected
    {
        get => model.InternalPartNumberSelected;
        set => SetProperty(model.InternalPartNumberSelected, value, model, (m, v) => m.InternalPartNumberSelected = v);
    }
}

这样您甚至可以向视图模型添加其他内容,并且它们不会影响 EF。

© www.soinside.com 2019 - 2024. All rights reserved.