【问题标题】:How to map SQL database results to a domain model in EF Core如何将 SQL 数据库结果映射到 EF Core 中的域模型
【发布时间】:2019-01-30 02:26:23
【问题描述】:

我有以下领域模型:

public class Country
{
    public string ISOAlpha3Code { get; set; }
    public string NameUS { get; set; }

    public string NameES { get; set; }
    public string NameFR { get; set; }

    public List<Province> Provinces { get; set; }
}

public class Province
{
    public string Code { get; set; }
    public string NameUS { get; set; }

    public string NameES { get; set; }
    public string NameFR { get; set; }
}

必须用于填充这些模型的数据库视图返回一个平面列表,如下所示:

我希望为 DbContext 配置实体,为国家/地区划分省份。

我可以创建一个与数据库结果匹配的域模型,但我真的很想将域模型与其在这个特定数据库中的表示方式分开 - 特别是如果数据库发生变化。

这样的事情可能吗?如果是这样,它将如何实施?

public class CountryConfiguration : IEntityTypeConfiguration<Country>
{
    public void Configure(EntityTypeBuilder<Country> builder)
    {
        builder.ToTable("v_WS_CountriesAndProvinces");

        builder.Property(p => p.NameUS).HasColumnName("CountryNameUS");
        builder.Property(p => p.NameES).HasColumnName("CountryNameES");
        builder.Property(p => p.NameFR).HasColumnName("CountryNameFR");

        // something to split out the provinces?
        builder.Property(p => p.Provinces).HasConversion(
            v => ToDB(v), // to DB
            v => FromDB(v) // from DB
            );
    }

    private List<Province> FromDB(object v)
    {  
        throw new NotImplementedException();
    }

    private object ToDB(List<Province> v)
    {
        throw new NotImplementedException();
    }
}

【问题讨论】:

  • 不,您不能使用 EF 来展开数据。
  • @GertArnold 真的吗?我似乎在这里这样做,还是我误解了? .stackoverflow.com/a/51613611/1678148 只是这一块更复杂
  • @Darren 这不是我所说的非扁平化。 OP 希望将包含表示多个对象的非不同数据的一维结果集转换为多维对象图。在使用转换时,我看不到任何使用 EF 的方法。

标签: .net entity-framework .net-core ef-core-2.0


【解决方案1】:

可以稍微调整您的模型以适应重复组。

public class Country {
    public string ISOAlpha3Code { get; set; }
    public virtual ICollection<Name> Names { get; set; }
    public virtual ICollection<Province> Provinces { get; set; }
}

public class Province {
    public string Code { get; set; }
    public string ISOAlpha3Code { get; set; }  // FK to Country
    public virtual ICollection<Name> Names { get; set; }
}

public class Name {
    public string ISOAlpha3Code { get; set; }  // FK to Country
    public string Code { get; set; }           // FK to Province, null for country names
    public string Language { get; set; }       // US-EN, etc.
    public string NameField { get; set; }
}

当然,这一切都假设数据在输入后是不可变的,否则如果关键数据可能发生变化(ISOAlpha3Code、代码),则使用代理 PK/FK 添加和维护关系。而且我会确保为 NameField 生成 NVARCHAR,因为您需要存储 Unicode 字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 2015-11-12
    • 2011-07-15
    • 2023-02-23
    • 1970-01-01
    相关资源
    最近更新 更多