1

如何使用 SubSonic 的 Schema builder 在数据库中创建二进制列?

所以今晚我决定潜入 SubSonic。我在这里看到了很多问题以及 Rob 和其他许多人的精彩回应。我看到 SubSonic 是一个 ORM,使用 T4 模板它可以从现有数据库中生成一些非常漂亮和高效的类。

但是,我想走另一条路。我有一个非常丰富的域,并且想使用 SubSonic 和 RunMigrations 选项从我的域临时创建表。

一切都运行得非常好(甚至编写了我自己的 Upgrade() 函数,该函数根据程序集修订号检测代码库是否有更改,然后将所有对象更新迁移到数据库 - 对于自动升级数据库来说非常巧妙和有效)。

但是,您如何让 SubSonic 创建二进制列?也许我没有按预期使用它(我没有使用 Query 或 SqlQuery,只是 SimpleRepository 的 Linq 接口)。见下文(使用常见的“博客文章”示例):

[SubsonicTable]
public class Post
{
    [SubSonicPrimaryKey]
    public Int32 PostID { get; set; }

    [SubSonicStringLength(1024)]
    public String Title { get; set; }

    [SubSonicLongString]
    public String Body { get; set; }

    [SubSonicStringLength(5)]
    public String? LangaugeCode { get; set; }

    public DateTime? Published { get; set; }

    public PostType PostType { get; set; }
    public Int32 PostTypeID
    {
        get
        {
            return this.PostType.GetHashCode();
        }
        set
        {
            Enum.Parse(typeof(PostType), value.ToString());
        }
    }

    public Byte[] Image { get; set; }
}

public enum PostType
{
    NotSet = 0
    ,BlogPost
    ,Comment
    ,Trackback
    ,Pingback
}

当通过 SimpleRepository 保存或查询此 Post 对象时,它缺少两列:PostType(或类型为枚举 PostType)和 Image(类型为 byte[] 数组)。

现在,我在这里找到了有人发布的关于使用 Int32 PostTypeID 解决枚举问题的 hack-of-an-answer。来吧 Rob,SubSonic 应该能够支持 INT 的枚举类型,并从它们返回。;) 这就是我拥有 PostTypeID 的原因,它会被正确创建和编写。

这是为我创建 Post 表以及插入第一个帖子的命令示例:

Post p = new Post();
p.Title = "My Title";
p.Body = "The body of the post.";
p.PostType = PostType.BlogPost;

var repo = new SimpleRepository(SimpleRepositoryOptions.RunMigrations);
repo.Add(p);

注意:您不应该在生产中使用此代码,因为 RunMigrations 在第一次运行时有很多额外的 TSQL 查询。

您可以从上面的示例中看到,如果 Posts 表不存在,这将创建它,并创建列。

但是,这不会创建上面提到的两列:PostType 和 Image。

想法?并提前感谢。

4

2 回答 2

4

我原以为我们有一个二进制嗅探器——结果证明它不起作用。我需要添加这个——更好的是,如果你不介意分叉我们拥有的东西并添加这个——我会爱你的。掠夺我们的扩展东西 - 你想修改 ToDataTable() (我认为)......

如果你没有机会 - 我会在接下来升级 SimpleRepo 时添加这个......

于 2009-09-13T05:53:06.107 回答
0

我自己也遇到了 Binary 专栏问题。如果您有补丁/修复程序,我愿意对其进行测试。

于 2009-10-24T01:20:12.857 回答