EF 4.1 模型中的图像数据类型优先
Posted
技术标签:
【中文标题】EF 4.1 模型中的图像数据类型优先【英文标题】:Image datatype in EF 4.1 model first 【发布时间】:2011-06-27 10:11:01 【问题描述】:我们有一个使用实体框架 4.0 的项目。我们绘制模型,然后生成 SQL Compact 3.5 DB。
由于我们需要一个大型 BLOB 存储,我们创建了一个具有 Image 数据类型的列(因为 Binary 限制为 8000 字节)。但是,当更新到 EF 4.1 时,我们的模型被静默转换为具有 Binary 列!
不用担心,我们认为,我们只需将其改回即可。问题是 Image 不能再选择了!并且 - 指定二进制并将 length 设置为较大的值,例如 100000,在尝试生成 DB 时会出错。
我们从EF 4.1 Release Notes、A related ADO.net team blog post、A third post describing the related issue 和A SO questing discussing the related issue 中发现了一些使用代码优先 方法的指针。但是,所有这些都使用 Code First 方法来讨论这个问题。
任何解决它的指针模型优先?
谢谢!
【问题讨论】:
您可以手动编辑 EDMX 文件吗? 是的,我们可能可以。我们还可以在生成后编辑数据库。首先,我们不想这样做,因为我们目前经常更新数据库。如果 8000 字节是从 EF 4.0“升级”到 EF 4.1 后的限制,这似乎也很糟糕...... 【参考方案1】:您需要使用 XML 编辑器打开模型文件.edmx
。在<edmx:StorageModels>
部分,将您的数据Property
的Type
从varbinary
更改为image
。
例如:
<EntityType Name="DataSet">
<Property Name="data" Type="image" Nullable="false" />
</EntityType>
您可能还需要手动更改.sdf
文件中列的类型。
这是一个小技巧,因此每次更改模型时都必须这样做。
【讨论】:
看起来很老套,但我想这是我们目前最好的。谢谢【参考方案2】:将您的图像转换为字节数组并像这样存储它,然后在您将其从数据库中拉出时转换为图像,这就是我存储大部分 blob 类型数据的方式 至于您提到的代码优先方法问题,是否有特定原因您不能使用代码优先 API 和数据库的流畅映射
编辑:
将 varbinary(max) 用于大于 8kb 的数据类型,因为图像将在未来被弃用 ref 在您的 edmx 文件中,如果您首先使用模型,那么您可以在设计器中选择列时在属性部分中设置列数据类型如果您使用的是数据库优先设计,那么您可以更改数据库中的数据类型,然后从数据库
codefirst api 创建您的数据库,然后使用逆向工程 codefirst 使用实体框架 powertools ctp 生成您的代码优先模型和上下文
【讨论】:
谢谢,这就是主意。问题不在于序列化或反序列化,而是我们无法让 Entity Framework 4.1 生成能够容纳足够字节的 any 列类型。 image 应该能够容纳最多 2gb 的数据,但应该避免在生产服务器中使用,因为它将在未来版本的 sql server 中删除 varbinary(max) 是微软建议的数据类型用于这种将超过 8000b 的二进制数据 Chris:这个问题与 SQL Server Compact 相关,而不是 SQL Server,在 Compact 映像中完全支持,并且没有 varbinary(MAX) 哎呀抱歉,请记住尽管 sql compact 对数据库有严格的限制,但如果您想在 sql compact 中使用您正在寻找的图像大小的 blob,您可能需要重新考虑您的实现大小限制约为 1gb (1,073,741,823),总数据库大小为 4gb msdn.microsoft.com/en-us/library/ms172424%28v=SQL.110%29.aspx以上是关于EF 4.1 模型中的图像数据类型优先的主要内容,如果未能解决你的问题,请参考以下文章
使用EF 4.1 Fluent Code First的每类型表继承
Windows窗体应用程序中的连接字符串EF 4.1代码优先SQL紧凑