簡體   English   中英

C#.Net EF 6.1 Using object base class as property type does not map a db object

[英]C# .Net EF 6.1 Using object base class as property type does not map a db object

""我有結果 object 用於 map 多表中使用的查詢:

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

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

英孚呼叫

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 屬性已填充,但值仍為 null。 有沒有辦法填充 Value 屬性?

一句話,“不要”? :)

您正試圖通過任何可能形狀的孔來敲擊方形 EF 實體。 為每個結果表聲明實體。 他們可以共享一個公共接口並公開一個 object “值”,如果那是你真正想要的。 試圖將它們全部塞進一個實體會帶來更多問題,例如稍后解析記錄最初來自哪個表,以及 ID 的潛在重疊。 實體框架是對象和關系表之間的映射器,旨在一對一,以便操作可以從表關聯到 object 並返回。

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 將 go 發送到數據庫並查詢您認為合適的數據以填充到 POCO 結果 object 中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM