多对可选一关系可能

本文关键字:关系 | 更新日期: 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();

我得到零,尽管我的数据库中有一个SubscriptionDeviceID为空。

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]属性来实现这一点。参考