在实体框架中将对象类型属性映射到 varbinary(MAX)

Posted

技术标签:

【中文标题】在实体框架中将对象类型属性映射到 varbinary(MAX)【英文标题】:Mapping object type property to varbinary(MAX) in Entity Framework 【发布时间】:2015-05-27 07:02:54 【问题描述】:

我有一个类型的属性为object 的类型,例如。

public class MyType

   public virtual object MyPropget; get;

这种类型必须是:

    使用Entity Framework 保存到数据库中,作为byte[](我已经弄清楚了序列化逻辑) 通过 WCF 传输(我将使用KnownType 属性)

如何映射我的object 属性以确保将其转换为字节数组进行存储?

注意:object 属性将是一个值类型(非复杂)

我想创建一个单独的类型来保存到数据库,例如:

public class MyTypeEntity

   public virtual byte[] MyPropget; get;

如何在类型之间进行转换/翻译,同时仍然能够定义关系映射?

这是否涉及某种对保存的拦截?

我能想到的最好的解决方案就是将序列化的数据简单地存储在数据库中。

如果在 C# 中有某种形式的 property covariance,也许这会更容易。据我所知,它不存在。 如果有我可以使用的优雅替代方案,我将不胜感激。

【问题讨论】:

【参考方案1】:

我建议在您的实体上保留 byte[] 字段;你的班级应该尽可能地模仿数据库结构。我过去做过类似的事情的一种方法是创建一个单独的类文件(请记住,您的实体是partial)并将NotMapped 属性添加到第二个文件。您可以让 getter 和 setter 进行从 objectbyte[] 的转换,并且在您的代码中,始终与 EF 将忽略的 object 属性进行交互。这非常轻松,EF 仍会将varbinary 字段跟踪到您不直接访问的byte[]

【讨论】:

好主意!绝对无痛。不知道我可以使用部分(EF新手)。谢谢@DrewJordan 如果您愿意,可以将其包含在第一个文件中...不过我喜欢单独保留数据库模型。 会看看团队更能接受什么,否则我也有同样的看法。我是否必须放置任何属性装饰以确保它没有被映射?或者只是不映射就足够了? 是的,属性是NotMapped,在您的新属性上。 知道了。错过了那个。谢谢!

以上是关于在实体框架中将对象类型属性映射到 varbinary(MAX)的主要内容,如果未能解决你的问题,请参考以下文章

在实体框架中将对象树附加到对象上下文

在实体框架中将模型属性设置为布尔值

将只读属性分配给实体框架中的新对象

实体框架 - 您能否将导入的存储过程的结果类型映射到自定义实体类型?

实体框架:为啥对象数组类型的属性没有持久化到数据库?

实体框架 - 代码优先:使用相同类型的多个子/可选属性进行映射