EF:将类属性映射到行而不是列

Posted

技术标签:

【中文标题】EF:将类属性映射到行而不是列【英文标题】:EF: mapping class properties to Rows not Columns 【发布时间】:2013-09-24 17:07:24 【问题描述】:

您知道如何将类的属性映射到表中的行吗? 让我们有一个表 [ID, KEY, VALUE]。

我希望为类中的预定义键值(例如属性)映射属性,其值取自值列。

示例:

表格

 ---------------------------------
| ID  | Key        | Value        |
 ---------------------------------
| 1   | Name       | Jon          |
 ---------------------------------
| 2   | Surname    | Doe          |
 ---------------------------------

public class Bar

    public string Name  get; set; 
    public string Suname  get; set; 

EF 中是否有任何东西可以实现这一点,还是我必须编写自己的自定义代码?

BR

【问题讨论】:

【参考方案1】:

您不能将值从列映射到属性。这样你就有了键值表,那么我建议你将表内容读入字典。

首先,您应该拥有与表列名称对应的属性的实体:

public class Foo

   public string Key  get; set; 
   public string Value  get; set; 

将此实体映射到您的表格后,您可以将所有表格内容读入字典:

var values = context.Foos.ToDictionary(f => f.Key, f => f.Value);

现在您可以通过键轻松获取值:

var name = values["Name"];

您甚至可以将此字典用作属性的后备存储:

public void Bar

    private Dictionary<string, string> values = 
         context.Foos.ToDictionary(f => f.Key, f => f.Value);

    public string Name  get  return values["Name"];  
    public string Surname  get  return values["Surname"];  

【讨论】:

事实并非如此。我希望将属性映射到 ROW 而不是 COLUMN。 @mdzieg 你不能那样做【参考方案2】:

这不是数据库的工作方式。每行是一个单独的实体。每列是实体的单独属性。如果您仅将数据库用作键/值对,则不要使用关系数据库。看看像 Riak 或 MongeDB 这样的 NoSQL 选项。如果这只是用于配置的单个对象,另一种选择是使用 xml 或配置文件。

现在,我不明白在您的示例中如何将姓名和姓氏结合成一个整体对象。我不相信这是可能的。

【讨论】:

希望将这些设置保留在数据库中以保持一致性。其实是有可能的。您可以在类级别的属性中指向表名和属性列,然后为每个属性定义其行值。我与有这种表的数据库一起工作。我想我必须编写自己的代码来处理这个问题。

以上是关于EF:将类属性映射到行而不是列的主要内容,如果未能解决你的问题,请参考以下文章

ef核心 - 如何将类映射的多个变体放到同一个表中

在 EF 4.1 中映射子类是不是需要 ID 属性?

添加导航属性会破坏微风客户端映射(但不是服务器端 EF6)

根据屏幕大小/媒体查询更改 Bootstrap 列类属性

Automapper 首先映射 EF 可投影属性,然后是其他属性

EF4.1 如何将属性映射到列