3

我正在使用 Orchard IRepository 来管理数据并保存到数据库……这就是我想要做的。

我的课是:

public class SocietaRecord
{
    public virtual int Id { get; set; }
    public virtual string Club { get; set; }
    public virtual string Email { get; set; }
}

我的迁移:

SchemaBuilder.CreateTable("SocietaRecord", table => table
    .Column<int>("Id", column => column.PrimaryKey())
    .Column<String>("Club", c => c.Nullable())
    .Column<String>("Email", c => c.Nullable())
);

请注意,Id 不是和 IDENTITY

现在,当我调用 Repository Create 时,执行以下插入:(使用 sql profiler 抓取)

exec sp_executesql N'INSERT INTO Match_SocietaRecord 
(Club, Email) VALUES (@p0, @p1); 
select SCOPE_IDENTITY()',N'@p0 nvarchar(4000),@p1 nvarchar(4000),
@p0=N'Test',@p1=NULL

失败是因为它忽略了我的 Id 并假设(错误地)Tables 有一个自动编号键。

这是错误:

NHibernate.Exceptions.GenericADOException: could not insert:
[Match.Models.SocietaRecord]
[SQL: INSERT INTO Match_SocietaRecord (Club, Email) VALUES (?, ?); 
select SCOPE_IDENTITY()] ---> System.Data.SqlClient.SqlException: 
Cannot insert the value NULL into column 'Id', table ORCHARD.dbo.Match_SocietaRecord'; 
column does not allow nulls. INSERT fails.

如何向存储库解释以查看表并且如果没有身份则不要假设身份以便我可以插入自己的 id?(是的,我在创建之前在对象记录上提供了一个有效的 ID)

编辑:我已经挖掘了一些代码,我认为:

  • 不正确的身份是由于 Fluent NHibernate:自动映射约定

  • Orchard 使用 IAutoMappingAlteration 覆盖不正确的假设

所以我可以改变我的问题:

如何为我的班级定义自定义 IAutoMappingAlteration 以向 Orchard 解释我的 Id 不是身份?

或(换句话说)

如自动映射文档中所述,我可以在哪里找到果园中的“自动映射配置”?

https://github.com/jagregory/fluent-nhibernate/wiki/Auto-mapping

(...“您可以通过覆盖自动映射配置中的 IsId 方法来修改自动映射器发现身份的方式。”...)

4

1 回答 1

0

Orchard 中的存储库实现可供更高级别的内容管理 API 使用。它的设计或意图不是作为通用存储库实现或 ORM 的替代品(我们为此提供了 nHibernate)。您应该直接使用 nHibernate。OrchardPo 模块中的低级示例:https ://bitbucket.org/bleroy/orchardpo/src

于 2013-01-29T17:28:09.443 回答