EF Code First不在一对一关系中设置外键

时间:2017-06-20 14:59:35

标签: sql ef-code-first foreign-keys

所以我正在尝试创建一个简单的Product-Preview 1对1关系,如下所示:

public class Product : BaseEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]        
    public Guid Id { get; set; }
    public string name { get; set; }
    public virtual EPS eps { get; set; }
    public virtual Preview preview { get; set; }

    [ForeignKey("userId")]
    public virtual User user { get; set; }
    public Guid userId { get; set; }

}

public class Preview : BaseEntity
{
    [Key,ForeignKey("Product")]        
    public Guid Id { get; set; }
    public string imagePath { get; set; }
    public double width { get; set; }
    public double height { get; set; }
    public virtual List<TextPreview> Texts { get; set; }
    public virtual List<ImagePlaceHolder> ImagePlaceHolders { get; set; }
    [ForeignKey("ProductId")]
    public virtual Product Product { get; set; }
    public virtual Guid ProductId { get; set; }
}

我希望在Previews表中有一个指向产品的外键 但是在运行迁移之后我就把它作为常规字段

enter image description here

我做错了什么?

1 个答案:

答案 0 :(得分:0)

你几乎拥有它,你只是错过了一块拼图...

[ForeignKey("ProductId")]
public virtual Product Product { get; set; }

您还需要添加...

public Guid ProductId { get; set; }

到预览对象。

还值得注意的是,ForeignKey属性可以放在任一属性上,字符串必须引用该对中的另一个。

正如它当前编写的那样,您正在尝试使Id属性指定相关表上的主键和外键的值。

所以你的最终代码可能看起来像......

public class Product : BaseEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]        
    public Guid Id { get; set; }
    [ForeignKey("User")]
    public Guid UserId { get; set; }
    public string name { get; set; }

    public virtual EPS eps { get; set; }
    public virtual Preview preview { get; set; }
    public virtual User user { get; set; }
}

public class Preview : BaseEntity
{
    [Key]        
    public Guid Id { get; set; }

    [ForeignKey("Product")]
    public Guid ProductId { get; set; }

    public string imagePath { get; set; }
    public double width { get; set; }
    public double height { get; set; }

    public virtual List<TextPreview> Texts { get; set; }
    public virtual List<ImagePlaceHolder> ImagePlaceHolders { get; set; }

    public virtual Product Product { get; set; }
}

作为旁注,我还建议不要使用像List<T>这样的具体集合类型,而是使用类似IList<T>ICollection<T>的内容,以促进更好的代码重用和可扩展性。