【问题标题】:Work-around for Struct with Entity Framework, Code-First approach使用 Entity Framework 的 Struct 的解决方法,代码优先方法
【发布时间】:2013-03-26 10:15:04
【问题描述】:

我目前正在使用 EF 和代码优先方法从现有系统构建数据库。

最好对“核心”类进行最小的更改。 因此,我想为 Structs 和 EF 找到解决方法。

是否可以以任何方式将 Struct 包装到类中,以便 EF 可以使用该 Struct 中的数据?既然 EF 能够为我的“核心”类创建自己的代理,难道我也不能这样做吗?

我对 .Net、C# 和 EF 的了解相当有限,因为我今年因为学士作业而开始学习这门语言。

任何帮助将不胜感激。

编辑:添加示例代码。

Core 有许多使用 TaxMode 结构的类,并将数据存储在这个结构中。

public class AcmeClass
{    
TaxMode Taxmode { get; set; }
}

结构如下:

public struct TaxMode
{
public string Name { get; set; }
public bool isTrue { get; set; }
}

TaxMode 的属性添加到这些类中的任何尝试都只会导致不可为空的错误。

【问题讨论】:

  • 对您有帮助吗?
  • @MikroDel 我正在考虑如何在不将 Struct 更改为 Class 的情况下将该类实现到现有系统中,我不想这样做。

标签: c# .net database entity-framework ef-code-first


【解决方案1】:

不支持结构。

您必须使用class 来代替它。

更新

看看这个Ladislav Mrnka answer

【讨论】:

  • 难道没有办法在运行时将 Struct 包装到一个类中或通过反射或其他方式进行编译吗?
  • 我没有得到链接中的方法来工作。可能只需要在这里做一个肮脏的修复,并将结构数据作为属性添加到使用这个结构的那些类中。
  • @JonasBG - 将结构添加为属性是个好主意。它会起作用 - 如果你真的可以在你的课堂上添加你的结构。在您的 cmets 之后,我认为您无法对代码进行任何更改。另一种方法是在一个类中重命名结构或将结构构建到另一个类中并没有太大区别。
  • 我是怎么理解的,那个例子在数据库中存储了一个int,然后填充到一个Struct中。我的方式是相反的。我有一个存储数据的结构。我希望将这些数据存储在数据库中。我很感激你花时间帮助我,尽管我对 C# 代码和方法还没有完全自信 =)
【解决方案2】:

你考虑过如下的序列化吗?

[NotMapped]
public TaxMode? TaxMode { get; set; }
public string TaxModeJSON
{
    get
    {
        return TaxMode == null
                   ? null
                   : JsonConvert.SerializeObject(TaxMode);
    }
    set
    {
        if (string.IsNullOrWhiteSpace(value))
            TaxMode = null;
        else
            TaxMode = JsonConvert.DeserializeObject<TaxMode>(value);
    }
}

该解决方案会将您的结构保存为 JSON,并使用序列化将数据存储到数据库或从数据库检索数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-03
    • 2016-04-14
    • 2014-08-12
    • 2019-08-02
    • 2022-08-12
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多