c# - 1对1的关系

标签 c# .net entity-framework

worker 只能拥有一辆车,并且车辆一次只能属于一名 worker 。 我知道有 3 种可能的实现:
1.

Vehicle(Id, Number)
Worker(Id, Name, VehicleId)
--> This allows two workers have the same vehicle.

2.

Worker(Id, Name)
Vehicle(Id, Number, WorkerId)
--> This allows worker to have two vehicles.

3.

   Worker(Id, Name)
   Vehicle(Id, Number)
   WorkersVehicles(Id, VehicleId, WorkerId)
    --> This allows each worker to have many vehicles and each vehicle to belong to many workers.

以上都无法描述所需的 1:1 关系。

如何在数据库和 Entity Framework 中描述这种 1:1 关系?

最佳答案

定义仅通过约束强制执行 1:1 关系的数据模型是不可能的,因为这需要循环引用,这意味着您永远无法插入关系的一侧,直到另一侧存在。

虽然可以通过技巧来解决这个问题(放弃约束,使用 RDBMS 特定的命令,如 Oracle 的延迟约束),但在传统意义上这是不可能的。您可以获得的最接近的是 1:0..1

以下是代表 Worker:Vehicle 的各种组合的模型:

0..1:1

Worker (ID, VehicleID unique constraint)
Vehicle (ID)

1:0..1

Worker (ID)
Vehicle (ID, WorkerID unique constraint)

0..1:0..1

Worker (ID)
Vehicle (ID)
WorkerVehicle (WorkerID, VehicleID) <-- primary key on one column, 
                                        unique constraint on the other

不幸的是,由于 EF 不支持唯一约束(或者更确切地说,它不识别或强制执行它们),因此您最终总是会得到关系另一端的集合而不是单个实体。

关于c# - 1对1的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6481711/

相关文章:

.net - 如何使用 Windbg 判断 .Net 控件是否可见

.net - 如何强制在 Visual Studio 2013 中打开解决方案文件 (SLN)?

c# - 将新项目添加到列表中替换列表中的旧项目

entity-framework - Entity Framework CTP 5 - 代码优先映射 - 无法正确映射枚举列表

c# - 如何访问通用存储库类中的 DbContext.Entry<TEntity> 方法 (TEntity)?

c# - 使用 Entity Framework 为 CRUD 操作实现通用存储库时出错

c# - 按相似日期分组列表

c# - 用于选择具有特定值的特定节点的 XPath 字符串 c#

C# Silverlight - 构建时间轴?

c# - .NET 的 FileSystemWatcher 在引发异常时崩溃,抛出文件正在用于 future 的文件