- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用消息传递系统,其中有一个名为Buffer的对象,该对象存储传入消息及其在系统中传播时的位置(用于消息跟踪)。我遇到了一些问题,这些问题表明我的应用程序或NHibernate根本存在问题。我正在使用Fluent NHibernate进行映射。
我有两个对象:Buffer和BufferMessageLocation。 Buffer是数据库中的一个表,每个记录代表一个缓冲消息(由代码中Buffer类的一个实例表示)。 BufferMessageLocation本质上是一个查找值,可以具有5个不同的值:0-4(每个值代表一个位置)。每个Buffer对象都包含一个BufferMessageLocation。 BufferMessageLocation在数据库中表示为Table [int ID,string Name]。
我必须进行一些分离的实体处理,因为我的应用程序中缓冲消息的寿命将比NHibernate会话的寿命更长。
这意味着:
打开新会话,从数据库中获取缓冲消息,关闭会话
在我的应用程序中进行一些处理,将缓冲区消息的位置更新为{ID = 0,Name =“ TestLocation”}。
打开新会话,通过调用Session.Load
将缓冲区消息的BufferMessageLocation更新为在步骤3中检索到的位置。
打开新的会话,在缓冲区消息上调用Session.Merge(buffer),关闭会话。
从我读到的有关NHibernate的所有内容来看,这应该有效。但是,由于某种原因,NHibernate试图将新记录插入BufferMessageLocation中,而不是仅更新Buffer记录。
这是错误消息:
could not insert: [AutomationBase.RepositoryNS.DataAccess.NHMG.Fluent.DTO.DBBufferMessageLocation][SQL: INSERT INTO tblBufferMessageLocation (Name) VALUES (?); select SCOPE_IDENTITY()]
Cannot insert the value NULL into column 'ID', table 'AutomationNew.dbo.tblBufferMessageLocation'; column does not allow nulls. INSERT fails.\r\nThe statement has been terminated.
NHibernate: INSERT INTO tblBufferMessageLocation (Name) VALUES (@p0); select SCOPE_IDENTITY();@p0 = 'TestLocation' [Type: String (4000)]
class Program
{
static void Main(string[] args)
{
DBBuffer dbBuffer;
DBInstruction instruction;
DBBufferMessageLocation bufferMessageLocation;
using (ISession session = FNHHelper.OpenSession())
{
using (ITransaction tran = session.BeginTransaction())
{
dbBuffer = session.QueryOver<DBBuffer>().List().First();
instruction = session.Load<DBInstruction>(2);
bufferMessageLocation = session.Load<DBBufferMessageLocation>(0);
tran.Commit();
}
}
//do application processing
dbBuffer.BufferMessageLocation = bufferMessageLocation;
//required attributes
dbBuffer.Instruction = instruction;
dbBuffer.Processed = false;
dbBuffer.FromProducer = false;
using (ISession session = FNHHelper.OpenSession())
{
using (ITransaction tran = session.BeginTransaction())
{
session.Merge(dbBuffer); <======== This is where the error is thrown
tran.Commit();
}
}
}
}
public partial class DBBuffer : IRepositoryEntity
{
public System.Guid ID { get; set; }
public DBLog Log { get; set; }
public DBError Error { get; set; }
public DBInstruction Instruction { get; set; }
public DBBufferMessageLocation BufferMessageLocation { get; set; }
public DateTime BufferTime { get; set; }
public string ClientIP { get; set; }
public string Description { get; set; }
public bool Processed { get; set; }
public bool FromProducer { get; set; }
}
public partial class DBBufferMessageLocation : IRepositoryLookup
{
public int ID { get; set; }
public string Name { get; set; }
public IList<DBBuffer> Buffers { get; set; }
public DBBufferMessageLocation()
{
Buffers = new List<DBBuffer>();
}
}
public partial class DBBufferMap : ClassMap<DBBuffer> {
public DBBufferMap() {
Table("tblBuffer");
Id(x => x.ID).GeneratedBy.Assigned().Column("ID");
References(x => x.Log).Column("LogID").Cascade.All();
References(x => x.Error).Column("ErrorID").Cascade.All();
References(x => x.Instruction).Column("InstructionID").Cascade.All();
References(x => x.BufferMessageLocation).Column("BufferMessageLocationID").Cascade.All();
Map(x => x.BufferTime).Column("BufferTime").Not.Nullable();
Map(x => x.ClientIP).Column("ClientIP");
Map(x => x.Description).Column("Description");
Map(x => x.Processed).Column("Processed").Not.Nullable();
Map(x => x.FromProducer).Column("FromProducer").Not.Nullable();
}
}
public partial class DBBufferMessageLocationMap : ClassMap<DBBufferMessageLocation> {
public DBBufferMessageLocationMap() {
Table("tblBufferMessageLocation");
Id(x => x.ID).GeneratedBy.Identity().Column("ID");
Map(x => x.Name).Column("Name").Not.Nullable();
HasMany(x => x.Buffers).KeyColumn("BufferMessageLocationID");
}
}
最佳答案
Id == 0被特殊视为“未设置ID”,将未设置的值更改为其他值,然后在构造函数中对其进行初始化
public DBBufferMessageLocationMap()
{
Id(x => x.ID, "ID").GeneratedBy.Identity().UnsavedValue(DBBufferMessageLocation.UNSET_ID);
}
public const int UNSET_ID = -1;
public DBBufferMessageLocation()
{
Id = UNSET_ID;
}
关于c# - NHibernate尝试为FK映射插入现有记录,但仅当int ID为0时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17863872/
假设我有两张 table ,a和 b : a { pk as int fk as int ... } b { pk as int ... } 我想在查询中加入 a 和 b,如下所示: FRO
我在 MYSQL 数据库的各个表中分配的列数比实际需要的长度要长。所以现在我尝试使它们具有适当的长度。它们是 VARCHAR(64),我想让它们变成 CHAR(36)。这些列涉及外键。这些更改将成为一
这是我的 table : 成员:ID,... 产品:ID,... 我的 Member 表有一些值,如果 Id = 0,则没有,并且我不想添加任何 Id = 0 的成员,所以我尝试运行此脚本: ALTE
这个问题已经有答案了: MySQL Relationships (1 个回答) 已关闭 4 年前。 这个问题可能在其他帖子中得到了回答,但我一直在搜索,但没有找到类似的东西(很有趣): 我使用 Lar
两个表,使用这些脚本创建: create table user_auth ( username varchar(255) NOT NULL, password varchar(255)
如果我添加带有 ON DELETE CASCADE 之类的 FK,我以后会遭受后果吗? 如果不是,我应该为 CakePHP 的 MySQL 中的 FK 使用什么命名约定? 最佳答案 您可以看到布局的命
我有一个类似的问题: How to create foreign key that is also a primary key in MySQL? 但是我的架构似乎与答案匹配,但仍然返回错误“ERRO
我有 2 个实体:PurchaseRequest (PR) 和 PurchasingRequestLineItem (PRLI)。他们遵循典型的关系模式,即 PR 有许多 PRLI。我在 PRLI 上
在尝试通过删除连接(非规范化)来优化物理数据模型时,我选择采用用户可能为 CommEventPurposeType 指定的所有可能值,将它们实现为 中的 BOOLEAN 属性>CommEventPur
我猜这些问题似乎很令人困惑。 库存实体 @Entity @IdClass(InventoryPK.class) public class Inventory { @Id @ManyTo
UNIQUE(col1, col2) 与 FK(col1), FK(col2) 我目前启用了两个索引,并且我不太关心外部关系本身。所以我想知道通过拥有所有这些键,我是否会获得冗余索引以提高读取性能,或
我需要将名为“practice”的列插入到表“cred_insurances”中,该表是一个 FK 引用表“practices” PK “id” 最佳答案 您需要通过在 mysql 提示符下运行以下命
使用 JPA 注释和 hibernate ,我们最近遇到了一个单向单多映射问题,如下所示: @Entity public class FooOrder extends AbstractEntity{
我经常听说在编写测试时不要使用随机数据,这对于大多数数据来说似乎是合理的。 但是,我认为我有可能需要这样做的情况。我正在处理的代码有一些非 AR 模型。例如,用户模型不受数据库表支持,因为我们通过 A
我的情况(简化)如下所示: 表 UNITS 在 UNITS.NAME 上有一个 PK。 (单位名称, varchar(12)) 表 DEPTS 在 DEPTS.NAME 上有一个 PK。 (部门名称,
我已经使用现有数据库的代码优先方法创建了一个 MVC 应用程序。 我注意到我的一个表不需要外键,所以我尝试删除它但我不断收到: The object 'FK_BorrowedProperty_code
为什么我的初始 update-database 失败了,我需要在我的数据库表类中更改什么才能使其正常工作? 当然,我可以将迁移脚本中的onDelete: ReferentialAction.Casca
我的主要目标是获取所有数据的最后更新时间。 详细信息:我有一张 table - 群组 groupId groupName timeUpdated (timestamp - on update) 还有另
作为练习,我正在构建我的第一个 SQL 数据库。我试图为数据库中的所有表创建语句。我想知道是否可以删除任何外键? 我的第二个问题是如何对使用 4 个或更多表的联接的数据库进行查询。 任何答案都将受到赞
我正在尝试在我的 H2 数据库中运行此 mysql 命令。 DB设置为mysql模式。 -- -----------------------------------------------------
我是一名优秀的程序员,十分优秀!