C# 如何映射请求-响应行为
我在尝试使用NHibernate Fluent映射对业务逻辑建模时遇到了一些问题 我有这样一个实体模型: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;} } 我的请求实体应该能够在没有响应实体的情况下生存,反之亦然,我的响
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
。谢谢您的回复。我认为你是对的;映射应该反转。不要介意有线情况,在这种情况下,响应可以在没有请求的情况下生存。这是因为我收到了别人请求的回复。请参阅我的新映射iEDIT 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();
}