【问题标题】:Code First The ForeignKeyAttribute on property '' on type '' is not valid. Entity Framework代码优先 类型 '' 的属性 '' 上的 ForeignKeyAttribute 无效。实体框架
【发布时间】:2021-01-16 11:06:40
【问题描述】:

我正在尝试创建代码,首先处理具有不同外键的用户表,但它给了我这条消息的错误:

“类型“EFNetflixAssignment.User”的属性“discount_id”上的 ForeignKeyAttribute 无效。在依赖类型“EFNetflixAssignment.Discount”上找不到外键名称“Discounts”。名称值应以逗号分隔外键属性名称列表。”

这是我的用户表代码

{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Required]
    public virtual int Id { get; set; }

    [Required]
    public virtual bool Status { get; set; }

    [Required]
    [MaxLength(255)]
    public virtual string Email { get; set; }

    [Required]
    [MaxLength(255)]
    public virtual string Password { get; set; }

    [Required]
    public virtual List<Payment_type> Payment_Types { get; set; }

    [Required]
    public virtual bool Activated { get; set; }

    [Required]
    [ForeignKey("Discounts")]
    public virtual List<Discount> discount_id { get; set; }
}

这是折扣码

public class Discount
{
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Required]
        public virtual int Id { get; set; }

        [Required]
        [MaxLength(255)]
        public virtual string discount_type { get; set; }

        [Required]
        public virtual decimal discount_amount { get; set; }
}

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: c# database entity-framework frameworks


    【解决方案1】:

    ForeignKey-Attribute 不会像这样工作。 如果你不关心数据库中外键的名称,那么你就不需要这个属性。 EF 会自动为导航属性创建外键。

    如果要指定此键的名称,则需要用户类中的另一个属性,该属性包含外键,然后您可以通过两种可能的方式连接这两个属性:

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Required]
    public virtual int Id { get; set; }
    
    [Required]
    public virtual bool Status { get; set; }
    [Required]
    [MaxLength(255)]
    
    public virtual string Email { get; set; }
    [Required]
    [MaxLength(255)]
    public virtual string Password { get; set; }
    
    [Required]
    public virtual List<Payment_type> Payment_Types { get; set; }
    
    [Required]
    public virtual bool Activated { get; set; }
    
    [Required]
    [ForeignKey("Discounts")]
    public List<int> Discount_Ids { get; set; }
    
    [Required]
    public virtual List<Discount> Discounts { get; set; }
    

    或者像这样:

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Required]
    public virtual int Id { get; set; }
    
    [Required]
    public virtual bool Status { get; set; }
    [Required]
    [MaxLength(255)]
    
    public virtual string Email { get; set; }
    [Required]
    [MaxLength(255)]
    public virtual string Password { get; set; }
    
    [Required]
    public virtual List<Payment_type> Payment_Types { get; set; }
    
    [Required]
    public virtual bool Activated { get; set; }
    
    [Required]
    public List<int> Discount_Ids { get; set; }
    
    [Required]
    [ForeignKey("Discount_Ids")]
    public virtual List<Discount> Discounts { get; set; }
    

    这是因为每当您想使用数据注释为外键设置特定名称时,您都需要为该键添加一个属性并将其与导航属性连接。

    但请注意,在您的数据库中,外键将设置在折扣表中,因为在一对多关系中,多方表始终采用 1- 的主键side 作为关系的外键。

    希望这能解决您的问题,如果您还有其他问题,请告诉我:)

    【讨论】:

    • 感谢您的回答 :) 我只有一个问题,如何将外键导航到用户表?
    • 不客气!好吧,恐怕没有办法这样做,因为在关系数据库中,当涉及到一对多关系时,外键总是放在多方的表中。这样做的原因是,在关系数据库中,您希望避免冗余并保持表清洁,以便它们只包含相关信息。如果您有一个“用户”表,并且您要存储与用户相关的每个折扣的每个外键,那么这会污染您的表。
    • 好吧,我会做一些不同的事情,只保留导航属性以获得用户类中的折扣。每当需要与用户相关的所有折扣的 Id 时,可以使用导航属性获取它们或使用 LINQ 从 dbcontext 加载它们。但是我不知道您的应用程序的目的,如果您想获得与用户相关的所有折扣的 id 列表,您可以明确地这样做。在软件开发中,什么是对什么是错并不总是那么简单,肯定有更干净的方法,但如果它适合你的目的,那就去做吧:)
    猜你喜欢
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    相关资源
    最近更新 更多