在表实体框架之间配置多个1到0..1的关系

时间:2014-02-18 17:29:53

标签: c# entity-framework code-first foreign-key-relationship

今天发布的帖子:

Entity framework one to zero or one relationship without navigation property

Understanding ForeignKey attribute in entity framework code first

我现在正在尝试配置以下关系:

Item1具有可选的RawData Item2具有可选的RawData Item3具有可选的RawData

RawData必须附加到Item1,Item2或Item3上 - 它不会单独存在。

目前的结构是:

class ItemX
{
    [Key]
    public int Id { get; set; }

    public int? RawDataId { get; set; }
    [ForeignKey("RawDataId")]
    public virtual RawData RawData { get; set; }
}

public class RawData
{

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    //other properties
}

我认为可以使用以下方式配置:

modelBuilder.Entity<Item1>().HasOptional(d => d.RawData).WithOptionalPrincipal().WillCascadeOnDelete(true);
modelBuilder.Entity<Item2>().HasOptional(d => d.RawData).WithOptionalPrincipal().WillCascadeOnDelete(true);
modelBuilder.Entity<Item3>().HasOptional(d => d.RawData).WithOptionalPrincipal().WillCascadeOnDelete(true);

但是这给出了以下错误:

  

类型'Item1'上的属性'RawData'上的ForeignKeyAttribute不是   有效。在依赖项上找不到外键名称“RawDataId”   输入'RawData'。

这与我今天早些时候发布的帖子中的错误相同。在那个我理解它由于共享主键而无法工作的原因。但是在这个例子中情况并非如此,因为RawData不能与Item1共享主键,因为Item2可能具有相同的id。

感谢您的帮助。

修改

我已经使用它了:

modelBuilder.Entity<Item1>().HasOptional(d => d.RawData).WithMany().HasForeignKey(d=>d.RawDataId).WillCascadeOnDelete(true);
//etc.

数据库看起来不错。看起来有点奇怪,虽然描述为WithMany但也许这就是当多重关系时需要的东西?

1 个答案:

答案 0 :(得分:0)

您需要在RawDataclass中包含Item1,Item2和Item3:

public class RawData
{

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public virtual Item1 i1 {get;set;}
    public virtual Item2 i2 {get;set;}
    public virtual Item3 i3 {get;set;}
    //other properties
}