【问题标题】:Add custom field to linq to sql auto generated entity将自定义字段添加到 linq to sql 自动生成的实体
【发布时间】:2010-03-24 00:36:16
【问题描述】:

我有一张带有varbinary(max) 列的表格用于图像。我已将表放在 LinqToSql 设计器上并将“延迟加载”设置为 true,因为我不想加载实际的图像数据。 是否有可能只知道该列是否为空,而不获取实际数据并且仍然只从数据库中进行一次查询? 我还想使用 Linq 创建的自动化实体。 像新的 bool HasImage {get;} 属性之类的东西正是我正在寻找的。​​p>

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案1】:

    Linq to SQL“自动”知道列是否有值的唯一方法是实际向数据库询问它。您可以使用字段/属性扩展部分类,但这不会消除查找。

    您可以做的事情之一是创建一个计算列(假设这里是 SQL 2005+,否则您必须尝试使其适应您的 DBMS)。如果你的表格是这样的,例如:

    CREATE TABLE Foo
    (
        FooID int NOT NULL IDENTITY(1, 1) PRIMARY KEY,
        FooName varchar(50) NOT NULL,
        FooImage varbinary(max) NULL
    )
    

    您可以这样添加计算列:

    ALTER TABLE Foo
    ADD FooHasImage AS CASE
        WHEN FooImage IS NULL THEN 0
        ELSE 1
    END
    

    然后您可以将FooHasImage 列添加到您的 Linq to SQL 实体中,不要延迟加载它,并检查该属性而不是显式检查 FooImage 属性。

    另外,我觉得有必要指出,以这种方式将图像存储在数据库中是次优的。这可能是必要的,我对您的环境了解不多,但如果您使用的是 SQL Server 2008,请考虑使用 FILESTREAM,因为它将使用文件系统进行廉价的“离线”BLOB 存储,而不是填充数据库中的全部内容。

    【讨论】:

    • 这似乎工作得很好!此外,我在设计器中将新列的类型从 int 更改为 System.Boolean。
    【解决方案2】:

    创建部分类

    public partial class MyTableObject
    {
        public bool HasImage { get { return MyColumn.HasValue; } }
    }
    

    不过,这可能会触发数据库命中

    我建议在您在上传或删除图像时设置的数据库“HasImage”位中添加一个新列

    【讨论】:

    • 我试过了,但是当字段延迟加载时,HasValue 似乎总是为假。它似乎没有触发对数据库的新查询。所以我的测试表明这是不可能的。但我可能忽略了一些东西:-)
    【解决方案3】:

    不知道您的 Q 的实际答案,但如果您没有得到答案:您自己在数据库中进行更改如何。 (当然,前提是您可以控制数据库设计)。

    并将 HasImage(或 HasContent)列直接放在表中,默认为“false”,当您添加图像时将其设为“true”,然后您可以查阅该列以查看是否有图像或不是。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多