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 表示 LightSwitchVersionv3.0。它运行于

我得到了 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 /> 属性添加到该列。

完整讨论在 https://social.msdn.microsoft.com/Forums/vstudio/en-US/44581489-438d-4844-8194-0b4a0a41e56f/exception-invalid-uri-the-uri-string-is-too-long?forum=lightswitch

这是我获得 完整 野兽的方法 运行:

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(),'-',''));

电灯开关

  1. 更新数据源。
  2. 全部保存,关闭解决方案,打开 ..\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" 将被正确声明。