多对可选一关系可能
本文关键字:关系 | 更新日期: 2023-09-27 18:26:16
我有以下情况:Device
可以有多个Subscriptions
,但Subscription
最多有一个Device
,或者根本没有。在我的数据库中,Subscriptions
有一个外键DeviceID
,它是Nullable
(而不是Device
类中的ID
属性)。由于某种原因,目前以下流畅的代码有效:
modelBuilder.Entity<Device>()
.HasMany(e => e.Subscriptions)
.WithRequired(e => e.Device)
.WillCascadeOnDelete(false);
如果我选择WithOption(),这应该是合乎逻辑的,我会得到错误。错误是此模型验证错误:
附加信息:在模型生成过程中检测到一个或多个验证错误:
Entities.Device_Subscriptions::多重性与冲突中角色"Device_Subscriptions_Source"中的引用约束关系"Device_Subscriptions"。因为中的所有属性Dependent Role不可为null,是Principal的多重性角色必须为"1"。
然而,例如,如果我现在查询(使用.WithRequired(...)
代码)
db.Subscriptions.Where(s => s.DeviceID == null).Count();
我得到零,尽管我的数据库中有一个Subscription
的DeviceID
为空。
Device
的(部分)模型:
public class Device
{
public Device() : base()
{
Subscriptions = new HashSet<Subscription>();
}
[Key]
public decimal DeviceID { get; set; }
public virtual ICollection<Subscription> Subscriptions {get; set;}
}
Subscription
的(部分)模型:
public partial class Subscription
{
[Key]
[Column(Order = 0)]
public decimal? DeviceID { get; set; }
[Key]
[Column(Order = 1)]
[StringLength(50)]
public string Type { get; set; }
public virtual Device {get; set;}
}
[Key]
属性用于声明实体的主键。将一个可为null的值作为PK的一部分实际上没有意义。
从评论中可以看出,您真正想要实现的似乎是在(DeviceID,Type)上创建一个索引。在EF 6.1中,他们添加了[Index]
属性来实现这一点。参考