C# 如何映射请求-响应行为

C# 如何映射请求-响应行为,c#,nhibernate,fluent-nhibernate,nhibernate-mapping,C#,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我在尝试使用NHibernate Fluent映射对业务逻辑建模时遇到了一些问题 我有这样一个实体模型: public class Request { ... public virtual Response Response {get; set;} } public class Response { ... public virtual Request Request {get; set;} } 我的请求实体应该能够在没有响应实体的情况下生存,反之亦然,我的响

我在尝试使用NHibernate Fluent映射对业务逻辑建模时遇到了一些问题

我有这样一个实体模型:

public class Request
{
    ...
    public virtual Response Response {get; set;}
}

public class Response
{
    ...
    public virtual Request Request {get; set;}
}
我的
请求
实体应该能够在没有
响应
实体的情况下生存,反之亦然,我的
响应
实体应该能够在没有
请求
的情况下生存。这可以映射为一对一映射吗?我知道,
响应
可以在没有
请求的情况下存在,但在我的情况下可能会发生这种情况

我读过这篇文章,但我仍然认为多对一映射对我来说并不合适,因为我的任何实体都不应该有响应或请求的列表

这种情况应该如何描述

编辑1

使用外键关联的My Fluent地图来自:

这似乎在许多情况下都有效,但当我尝试添加多个
请求
实体而不引用
响应
实体时,会出现以下错误:

System.Data.SqlClient.SqlException:违反唯一密钥 约束“UQ_uu请求_uu346FA94719588CEC”。无法插入重复项 输入对象“dbo.Request”。重复的键值为 (). 声明已终止

编辑2

public RequestMap()
{
    Id(x => x.Id).GeneratedBy.Guid();
    HasOne(x => x.Response).Cascade.All().PropertyRef(x => x.Request);
}

public ResponseMap()
{
    Id(x => x.Id).GeneratedBy.Guid();
    References(x => x.Request, "RequestId").Cascade.All();
}

使用此映射,在执行
request.Response=Response时,对象之间的映射不会持久化。我应该保护这个setter吗?

我可能误解了这个问题,但这似乎要求您用“引用”映射其中一个实体,用“>反向<引用”映射另一个实体


请看这里

编辑1的问题来自以下事实:

  • Request
    表对“ResponseId”列有唯一的约束。即,每行必须具有不同的值
  • 未引用响应而存储的
    请求
    具有
    NULL
    而不是任何值。。。都是。这打破了上述要求,即每一行都是唯一的
这种情况下的解决方案是从
ResponseId
列中删除数据库级别上的唯一键。因为这是我们需要的(请求而不响应)。也就是说,应该允许在ReponseId中有几个并发的空值

但让我有点困惑的是命名:response/Request

在我看来,这个请求(来自我的web开发经验)是触发因素,是第一个。如果一切正常,就会有一个响应返回。你的映射不应该反转吗?响应表是否包含RequestId

我在问题中看到了这样的说法:

我的请求实体应该能够在没有响应实体的情况下存在,反之亦然,我的响应实体应该能够在没有请求的情况下存在

那么。。。让我们假设:
响应
可以在没有
请求的情况下生存
。。。然后,即使使用唯一键约束,映射(但反向)也应该可以工作


更重要的是,纯粹的
一对一
映射将起作用,因为这两者可以共享主键(由请求生成,由响应消耗)

您认为我应该使用哪种解决方案?主键关联或外键关联。我认为主键关联不起作用,因为
响应
总是有
请求
,或者
请求
响应
——因此
Id(x=>x.Id).由.Foreign(“设置”)生成
无法使用。我正在考虑外键关联。请查看我的
编辑1
。谢谢您的回复。我认为你是对的;映射应该反转。不要介意有线情况,在这种情况下,响应可以在没有请求的情况下生存。这是因为我收到了别人请求的回复。请参阅我的新映射i
EDIT 2
。通常,最好设置关系的双方<代码>请求.响应=响应;response.Request=请求
如果我读对了,现在我们说的是关系通过响应的
请求
属性传递。所以我们应该确定,这个参考已经设置好了
public RequestMap()
{
    Id(x => x.Id).GeneratedBy.Guid();
    HasOne(x => x.Response).Cascade.All().PropertyRef(x => x.Request);
}

public ResponseMap()
{
    Id(x => x.Id).GeneratedBy.Guid();
    References(x => x.Request, "RequestId").Cascade.All();
}