如何在Orchard中使用带有int键的IRepository(NOT IDENTITY)

时间:2013-01-29 10:32:01

标签: sql-server asp.net-mvc insert orchardcms irepository

我使用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并假设(错误地)表具有自动编号密钥。

这是错误:

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不是身份?

或(换句话说)

我可以找到&#34;自动配置&#34;在自动映射文档中描述的果园中?

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

(...&#34;您可以通过覆盖自动配置中的IsId方法来修改自动播放器发现身份的方式。&#34; ...)

1 个答案:

答案 0 :(得分:0)

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