Lightswitch v3.0 中的图像:"Invalid URI: The Uri string is too long."
Images at Lightswitch v3.0: "Invalid URI: The Uri string is too long."
我有一个简单的 Lightswitch - 基于 Silverlight - 网络客户端。 Client.csproj 和 Server.csproj 表示 LightSwitchVersion
是 v3.0
。它运行于
- Visual Studio 2012 更新 4
- 用于 VS11 的 LightSwitch 可扩展性工具包
我有2个分机,都被选中了:
- LightSwitch Cosmopolitan Shell 和主题
- Microsoft LightSwitch 扩展
我得到了 MySQL table
CREATE TABLE `images` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`legend` varchar(200) NOT NULL,
`preview` blob,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
并且我在为 table 创建屏幕之前将 preview
字段声明为 Image 输入数据源。但是 运行 应用程序用这个
来问候我
使用 Lightswitch 2.0 一切正常。但自从我升级到 v3.0 后,这是唯一破坏一切的问题:-(
我自己还没有 运行 了解过这个,但引起了我的兴趣。 :)
好像是OData层在使用blob列的内容来保证数据并发,就是URI太长了。在本机 SQL 服务器 table 中,您只需添加一个 Rowversion 列,该列将被选中用于并发目的 - 事实上,Lightswitch Intrinsic 数据库会自动为您完成。我的理解是 MySQL 没有等效的 Rowversion 类型。
解决方法是在您的 MySQL table 上创建另一列,每次更新时由 MySQL 触发器递增,使其成为事实上的并发字段。更新数据源,然后编辑 .lsml 文件以将 <UseForConcurrency />
属性添加到该列。
这是我获得 完整 野兽的方法 运行:
MySQL
在 MySQL table 中添加用于并发检查的列:
(我决定使用 uuid()
。这是每次更改内容时获取唯一值的最简单方法!)
-- The column itself.
ALTER TABLE images ADD COLUMN rowversion BINARY(16);
-- Setup for all existing rows.
UPDATE images SET rowversion = UNHEX(REPLACE(UUID(),'-',''));
-- Now make it NOT NULL.
ALTER TABLE images MODIFY COLUMN rowversion BINARY(16) NOT NULL;
-- An insert trigger to get a default value for future rows.
CREATE TRIGGER images_before_insert
BEFORE INSERT ON images
FOR EACH ROW
SET NEW.rowversion = UNHEX(REPLACE(UUID(),'-',''));
电灯开关
- 更新数据源。
- 全部保存,关闭解决方案,打开 ..\Server\Properties\Service.lsml,然后将
<UseForConcurrency />
(不要更多)添加到 rowversion 条目(如 Phil 所说)。现在它可能看起来像
<EntityProperty
Name="rowversion"
PropertyType=":Guid">
<EntityProperty.Attributes>
<UseForConcurrency />
<Required />
<NotSearchable />
</EntityProperty.Attributes>
</EntityProperty>
但是停下来,不幸的是,这还不是全部!这个邪恶的 Lightswitch 在保存后不会重新获取 rowversion 值。所以 BEFORE UPDATE ON images
触发器永远无法满足我们的需求。相信我,每次更新你都会陷入 "Data Conflict" 地狱!!!您必须在客户端更改行版本:
public partial class ImageScreen
{
partial void ImageScreen_Saving(ref bool handled)
{
var changes = DataWorkspace.testData.Details.GetChanges();
foreach (var image in changes
.ModifiedEntities
.OfType<image>())
{
image.rowversion = Guid.NewGuid();
}
}
}
现在,客户现在知道来自他自己的最新行版本。如果另一个客户端修改相同的数据集,"Data Conflict" 将被正确声明。
我有一个简单的 Lightswitch - 基于 Silverlight - 网络客户端。 Client.csproj 和 Server.csproj 表示 LightSwitchVersion
是 v3.0
。它运行于
- Visual Studio 2012 更新 4
- 用于 VS11 的 LightSwitch 可扩展性工具包
我有2个分机,都被选中了:
- LightSwitch Cosmopolitan Shell 和主题
- Microsoft LightSwitch 扩展
我得到了 MySQL table
CREATE TABLE `images` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`legend` varchar(200) NOT NULL,
`preview` blob,
`createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
并且我在为 table 创建屏幕之前将 preview
字段声明为 Image 输入数据源。但是 运行 应用程序用这个
使用 Lightswitch 2.0 一切正常。但自从我升级到 v3.0 后,这是唯一破坏一切的问题:-(
我自己还没有 运行 了解过这个,但引起了我的兴趣。 :)
好像是OData层在使用blob列的内容来保证数据并发,就是URI太长了。在本机 SQL 服务器 table 中,您只需添加一个 Rowversion 列,该列将被选中用于并发目的 - 事实上,Lightswitch Intrinsic 数据库会自动为您完成。我的理解是 MySQL 没有等效的 Rowversion 类型。
解决方法是在您的 MySQL table 上创建另一列,每次更新时由 MySQL 触发器递增,使其成为事实上的并发字段。更新数据源,然后编辑 .lsml 文件以将 <UseForConcurrency />
属性添加到该列。
这是我获得 完整 野兽的方法 运行:
MySQL
在 MySQL table 中添加用于并发检查的列:
(我决定使用 uuid()
。这是每次更改内容时获取唯一值的最简单方法!)
-- The column itself.
ALTER TABLE images ADD COLUMN rowversion BINARY(16);
-- Setup for all existing rows.
UPDATE images SET rowversion = UNHEX(REPLACE(UUID(),'-',''));
-- Now make it NOT NULL.
ALTER TABLE images MODIFY COLUMN rowversion BINARY(16) NOT NULL;
-- An insert trigger to get a default value for future rows.
CREATE TRIGGER images_before_insert
BEFORE INSERT ON images
FOR EACH ROW
SET NEW.rowversion = UNHEX(REPLACE(UUID(),'-',''));
电灯开关
- 更新数据源。
- 全部保存,关闭解决方案,打开 ..\Server\Properties\Service.lsml,然后将
<UseForConcurrency />
(不要更多)添加到 rowversion 条目(如 Phil 所说)。现在它可能看起来像
<EntityProperty
Name="rowversion"
PropertyType=":Guid">
<EntityProperty.Attributes>
<UseForConcurrency />
<Required />
<NotSearchable />
</EntityProperty.Attributes>
</EntityProperty>
但是停下来,不幸的是,这还不是全部!这个邪恶的 Lightswitch 在保存后不会重新获取 rowversion 值。所以 BEFORE UPDATE ON images
触发器永远无法满足我们的需求。相信我,每次更新你都会陷入 "Data Conflict" 地狱!!!您必须在客户端更改行版本:
public partial class ImageScreen
{
partial void ImageScreen_Saving(ref bool handled)
{
var changes = DataWorkspace.testData.Details.GetChanges();
foreach (var image in changes
.ModifiedEntities
.OfType<image>())
{
image.rowversion = Guid.NewGuid();
}
}
}
现在,客户现在知道来自他自己的最新行版本。如果另一个客户端修改相同的数据集,"Data Conflict" 将被正确声明。