【发布时间】: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