【问题标题】:A Castle ActiveRecord relationship that does not use the Primary Key不使用主键的 Castle ActiveRecord 关系
【发布时间】:2015-11-24 04:27:55
【问题描述】:

我正在将 Castle ActiveRecord 连接到旧数据库,但在连接一对多关系时遇到了麻烦。问题是外键没有引用另一个表的主键,它使用了另一个列。

这些是表格(为清楚起见已缩短):

CREATE TABLE [Rule](
    [ID] [uniqueidentifier] NOT NULL,
    [HeadingID] [int] NULL
)

CREATE TABLE [Heading](
    [ID] [uniqueidentifier] NOT NULL,
    [ID2] [int] NOT NULL
)

Rule 表中的 HeadingID 字段是一个外键,它引用 Heading 中的 ID2 字段。

所以,在 Rule 类的定义中我有:

[BelongsTo(Column = "HeadingID", PropertyRef = "OrderID")]
public virtual Heading Heading { get; set; }

这似乎工作正常,我可以毫无问题地访问规则的标题(当然,如果我将 HasMany 设置为惰性)。

在 Heading 类定义中我有:

[HasMany(Lazy = true)]
public IList<Rule> Rules { get; set; }

当我访问集合时,我得到一个 SQL 异常“操作数类型冲突:uniqueidentifier 与 int 不兼容。” 看起来 AR 正在尝试进行这样的选择(为清楚起见进行了简化):

SELECT ... FROM Rule rules0_ ... WHERE rules0_.HeadingID = ?

在哪里?是 Heading.ID 的 GUID(应该是 Heading.ID2 的 int)。

我找不到允许我设置外键引用的列的 HasMany 属性。有没有办法做到这一点?

【问题讨论】:

    标签: castle-activerecord


    【解决方案1】:

    似乎无法做到这一点。我能做的最好的就是自定义查找:

    public virtual IEnumerable<Rule> Rules {
        get {
            return Rule.Queryable.Where(x => x.Heading == this);
        }
    }
    

    这对我来说已经足够好了。

    【讨论】:

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