【问题标题】:C# .Net EF 6.1 Using object base class as property type does not map a db objectC# .Net EF 6.1 使用对象基类作为属性类型不映射数据库对象
【发布时间】:2022-01-11 20:49:56
【问题描述】:

""我有一个Results对象,我用它来映射多个表中使用的查询:

public class Result
{
    public int Id{ get; set; }

    //Value could be bool, int, string, date
    public object Value { get; set; }
}

EF 调用

results.AddRange(context.Database.SqlQuery<Result>("SELECT Id, Value FROM ResultStrings")).ToList());
results.AddRange(context.Database.SqlQuery<Result>("SELECT Id, Value FROM ResultInt")).ToList());

Id 属性被填充,但 Value 保持为空。有没有办法填充 Value 属性?

【问题讨论】:

  • 值可以是 bool、int、string、date - 怎么样?什么数据库列类型同时支持所有这些东西?

标签: c# asp.net entity-framework entity-framework-6


【解决方案1】:

一句话,“不要”? :)

您正试图通过任何可能形状的孔来敲击方形 EF 实体。为每个结果表声明实体。如果这是您真正想要的,它们可以共享一个通用接口并公开一个对象“值”。试图将它们全部塞进一个实体会带来更多问题,例如稍后解析记录最初来自哪个表,以及 ID 的潜在重叠。实体框架是对象和关系表之间的映射器,旨在一对一,以便操作可以在表与对象之间相互关联。

public abstract class Result
{
     public int Id { get; set; }
     public abstract object Value { get; }
}

public class IntResult : Result
{
     public int RawValue { get; set; }

     [NotMapped]
     public override object Value => return RawValue;
}

public class StringResult : Result
{
     public string RawValue { get; set; }

     [NotMapped]
     public object Value => return RawValue;
}

然后进行查询,不幸的是,如果您希望“Value”作为列名和抽象公共属性名,则需要为结果设置别名。使用 SqlQuery 时,EF 不会尊重 [Column("Value")] 属性。

results.AddRange(context.Database.SqlQuery<StringResult>("SELECT Id, Value AS RawValue FROM ResultStrings")).ToList());
results.AddRange(context.Database.SqlQuery<IntResult>("SELECT Id, Value AS RawValue FROM ResultInt")).ToList());

或者,不要使用 EF 来获得这些结果。只需通过 ADO 进入数据库并查询您认为合适的数据以填充到 POCO Result 对象中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    相关资源
    最近更新 更多