Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Fluent NHibernate映射自定义GUID_C#_Vb.net_Fluent Nhibernate_Guid - Fatal编程技术网

C# 使用Fluent NHibernate映射自定义GUID

C# 使用Fluent NHibernate映射自定义GUID,c#,vb.net,fluent-nhibernate,guid,C#,Vb.net,Fluent Nhibernate,Guid,我正在使用Fluent NHibernate映射Oracle数据库。这是一个遗留数据库,所以我不能真正改变我想要的一切 有一个GUID字段,但键仍然是复合的(我将尽快更改此字段,以便键不是复合的,但我现在不能这样做)。GUID是具有以下布局的VARCHAR2字段:551608b1-275d-49f6-9561-44d01aacf23f。GUID不是通过Oracle中的序列添加的,而是从代码(C#或VB.net)插入的 我像这样映射键(VB.net): 或者像C中这样# 映射效果很好,对象正是我想

我正在使用Fluent NHibernate映射Oracle数据库。这是一个遗留数据库,所以我不能真正改变我想要的一切

有一个GUID字段,但键仍然是复合的(我将尽快更改此字段,以便键不是复合的,但我现在不能这样做)。GUID是具有以下布局的VARCHAR2字段:551608b1-275d-49f6-9561-44d01aacf23f。GUID不是通过Oracle中的序列添加的,而是从代码(C#或VB.net)插入的

我像这样映射键(VB.net):

或者像C中这样#

映射效果很好,对象正是我想要的,直到我需要保存为止

当我试图保存或更新未更改的对象时

m_Session.SaveOrUpdate(obj)
我得到:

问题是我没有使用序列生成GUID吗?如何克服这一问题?

编辑: CompositeId没有我认为的GeneratedBy方法,问题的根源可能是KeyReference方法的映射。检查井类映射,确保其设置为assigned,因为没有本机标识(在您的案例中为Oracle序列)对该标识有效

您需要告诉NHibernate您正在为该实体手动分配Id。尝试下面所示的映射。当然,当您创建此实体的新实例时,需要在代码中为GUID和SetDate设置适当的值。您还需要将适当的井类实例指定给井属性

CompositeId()
    .KeyReference(x => x.Well, "WellID")
    .KeyProperty(x => x.GUID, "GUID")
    .KeyProperty(x => x.SetDate, "SET_DATE")
    .GeneratedBy.Assigned();
“正常”使用guid 在实体中,Id应为Guid类型:

public virtual Guid Id { get; private set; }
在类映射中,您应该这样映射它:

Id(x=>x.Id)
.栏(“Id”)
.GeneratedBy.GuidComb()

这将使用推荐的comb算法生成新的guid

Id(x=>x.Id)
.栏(“Id”)
.GeneratedBy.Guid()

使用System.Guid生成新的Guid 或

Id(x=>x.Id)
.栏(“Id”)
.GuidNative()生成的


如果您想让数据库为您生成Guid。

如果密钥不是复合的,这会更简单吗?我知道我可以为ID这样做,但我也可以为复合ID这样做吗?Id(x=>x.GUID,“GUID”).GeneratedBy.Assigned();哎呀!关于CompositeId与NHibernate中的Id相似的错误假设。我编辑了这个问题。
m_Session.SaveOrUpdate(obj)
CompositeId()
    .KeyReference(x => x.Well, "WellID")
    .KeyProperty(x => x.GUID, "GUID")
    .KeyProperty(x => x.SetDate, "SET_DATE")
    .GeneratedBy.Assigned();
public virtual Guid Id { get; private set; }