【问题标题】:Is many to optional one relation possible?多对可选的关系是否可能?
【发布时间】:2015-12-09 15:58:16
【问题描述】:

我有以下情况:一个Device 可以有多个Subscriptions,但一个Subscription 最多有一个Device 或根本没有。在我的数据库中Subscriptions 有一个外键DeviceID,它是Nullable(不是ID 类中的ID 属性)。目前由于某种原因,以下流畅的代码可以工作:

            modelBuilder.Entity<Device>()
            .HasMany(e => e.Subscriptions)
            .WithRequired(e => e.Device)
            .WillCascadeOnDelete(false);

如果我选择 WithOptional(),这应该是合乎逻辑的,我会得到错误。错误是这个 ModelvalidationError:

附加信息:在模型生成过程中检测到一个或多个验证错误:

Entities.Device_Subscriptions: : 多重性与 角色“Device_Subscriptions_Source”中的引用约束 关系“设备订阅”。因为所有的属性在 依赖角色是不可为空的,主体的多重性 角色必须为“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;}
}

【问题讨论】:

  • 为什么 Subscription 类的 DeviceID 列上有 [Key] 属性?我不认为你可以将你的 Key 的一部分设为 Nullable,但老实说我不知道​​
  • 订阅类中的DeviceID是数据库中Device的可为空的外键,并且与Type一起被索引
  • @AlexanderDerck [Key] 用于主键,不能为空。对于外键,您应该改用 [ForeingKey]
  • @AlexanderDerck 正如 Fabio 所说,您在这里错误地使用了 [Key] 属性。除了 [ForeignKey] 属性之外,如果您使用的是 EF6.1,还有一个 [Index] 属性可能有助于 msdn.microsoft.com/en-us/data/jj591583.aspx
  • @Vlad274 谢谢,明天我会尝试使用Index 属性(家庭atm),奇怪的是这个类是由数据库首先自动生成的。也许DeviceID 起初不能为空,但有人更改了它,我恐怕只能明天检查

标签: c# entity-framework


【解决方案1】:

[Key] 属性用于声明实体的主键。将可空值作为 PK 的一部分并没有什么意义。

从 cmets 看来,您真正想要完成的是在 (DeviceID, Type) 上有一个索引。在 EF 6.1 中,他们添加了应该完成此操作的 [Index] 属性。 Reference

【讨论】:

    猜你喜欢
    • 2022-11-26
    • 2016-09-23
    • 1970-01-01
    • 2013-06-10
    • 2013-11-19
    • 2012-03-31
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多