【发布时间】:2014-03-18 02:17:22
【问题描述】:
由于 FK 限制,我在尝试删除记录时遇到了问题。因此,我回到了绘图板上,并试图说明这种关系应该如何运作。
这是我的第一类代码:
public class MemberDataSet
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int? DeferredDataId { get; set; }
[ForeignKey("DeferredDataId")]
public virtual DeferredData DeferredData { get; set; }
}
public class DeferredData
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
//other properties
}
我希望实现的是 MemberDataSet 有零个或一个 DeferredData。我可以从 MemberDataSet 访问 DeferredData,但 DeferredData 不需要返回 MemberDataSet 的导航属性。 DeferredData 应该严格要求 MemberDataSet。因此,在理想情况下,删除 MemberDataSet 将删除已分配的 DeferredData。
在我看来,我想要说明的是:
modelBuilder.Entity<MemberDataSet>().HasOptional(d => d.DeferredData).WithRequired().WillCascadeOnDelete(true);
即MemberDataSet 有一个选项 DeferredData 但 DeferredData 有一个必需的 MemberDataSet 并且这种关系应该在删除时级联。
但是,我得到一个错误:
类型“MemberDataSet”的属性“DeferredData”上的 ForeignKeyAttribute 无效。在依赖类型“DeferredData”上找不到外键名称“DeferredDataId”。 Name 值应该是逗号分隔的外键属性名称列表。
编辑
在对下面 Sam 的回答感到满意后,我继续更改了其他一些 ForeignKey 属性。 MemberDataSet 有另一个名为 SignedOffBy 的属性,它是一个 userProfile。这以前看起来像这样:
public class MemberDataSet
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int? DeferredDataId { get; set; }
[ForeignKey("DeferredDataId")]
public virtual DeferredData DeferredData { get; set; }
public int? SignedOffById { get; set; }
[ForeignKey("SignedOffId")]
public virtual UserProfile SignedOffBy { get; set; }
}
在下面讨论了 ForeignKey 属性实际上在做什么之后,我将其更改为:
public class MemberDataSet
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int? DeferredDataId { get; set; }
[ForeignKey("Id")]
public virtual DeferredData DeferredData { get; set; }
public int? SignedOffById { get; set; }
[ForeignKey("UserId")]
public virtual UserProfile SignedOffBy { get; set; }
}
但是,我现在收到一条非常相似的错误消息:
The ForeignKeyAttribute on property 'SignedOffBy' on type 'MemberDataSet' is not valid. The foreign key name 'UserId' was not found on the dependent type 'MemberDataSet'. The Name value should be a comma separated list of foreign key property names.
这里的区别在于这种关系是多对一的,即 1 个用户可以拥有多个已签署的数据集。这是造成差异的原因吗?即 UserProfile 现在是主体对象,所以 ForeignKey 在 MemberDataSet 上?
再次感谢您的任何帮助。
【问题讨论】:
-
您不需要
ForeignKey属性。 EF 从名称中推断出来。 -
是的,但它不会推断出我指定的内容吗?
标签: c# entity-framework code-first relationship cascading-deletes