【问题标题】:Multiplicity in Entity Framework实体框架中的多重性
【发布时间】:2015-10-10 01:51:01
【问题描述】:

我是 Entity Framework 的新手,在尝试实现我的 ERD Code First 时遇到了一些问题。情况如下:

ERD

一个产品有一组问题(QuestionGroup)。一个 QuestionGroup 有多个问题,可以属于多个 Questionaires。问卷基本上有一个问题组和一个问题顺序。 questionorder 应该保持问题在该问卷中的位置。 Questionaire 表是必需的,因为一个 QuestionGroup 可以有多个 questionorder,并且一个 questionorder 可以属于多个 questiongroup。

因为我正在尽力保持这篇文章简洁,所以我不会发布我所有的课程,除非你要求查看它们。我制作的实体类如下所示:

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

        [MaxLength(2000)]
        [Required]
        public string Text { get; set; }
        public Answer Answer { get; set; }
        public QuestionType Type { get; set; }
        public ICollection<QuestionAnswerOption> Options { get; set; }
        public ICollection<QuestionOrder> Orders { get; set; }

        [ForeignKey("FollowupQuestion")]
        public int QuestionId { get; set; }
        public virtual Question FollowupQuestion { get; set; }
        [ForeignKey("Questiongroup")]
        public int QuestionGroupId { get; set; }
        public virtual QuestionGroup Questiongroup { get; set; }

    }

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

        public int Position { get; set; }

        [ForeignKey("Question")]
        [Required]
        public int QuestionId { get; set; }
        public virtual Question Question { get; set; }
        [ForeignKey("Questionaire")]
        [Required]
        public int QuestionaireId { get; set; }
        public virtual Questionaire Questionaire { get; set; }

    }

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

        [MaxLength(150)]
        [Required]
        [Index(IsUnique = true)]
        public string Name { get; set; }
        [MaxLength(500)]
        public string Summary { get; set; }
        [MaxLength(500)]
        public string Examples { get; set; }
        public virtual QuestionGroup QuestionGroup { get; set; }
    }

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

        public ICollection<Question> Questions { get; set; }

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

    }

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

        public QuestionGroup Group { get; set; }

        public QuestionOrder Order { get; set; }
    }

我得到的错误如下所示:

QuestionGroup_Product_Source::多重性在关系“QuestionGroup_Product”中的角色“QuestionGroup_Product_Source”中无效。由于 Dependent Role 属性不是关键属性,因此 Dependent Role 多重性的上限必须为“*”。

QuestionOrder_Questionaire_Source::多重性在关系“QuestionOrder_Questionaire”中的角色“QuestionOrder_Questionaire_Source”中无效。由于 Dependent Role 属性不是关键属性,因此 Dependent Role 多重性的上限必须为“*”。

QuestionType_Question_Source::多重性在关系“QuestionType_Question”中的角色“QuestionType_Question_Source”中无效。由于 Dependent Role 属性不是关键属性,因此 Dependent Role 多重性的上限必须为“*”。

我们在这里遇到的问题是: 这里有人知道修复我的表之间关系的方法吗?也许我的 ERD 也需要一些改进,但我认为问题在于我的 Code First 实现缺少一些东西。

【问题讨论】:

  • 您还有其他实体配置吗?例如,使用 Fluent API?
  • 不,我没有。我不确定它是如何工作的。
  • 缺少产品和问卷的定义。不是 100% 肯定,但它可能会令人窒息,因为您的 FK 属性名称与 Key 属性名称不同。我知道这看起来很傻,但是将 Question 中的 Id 重命名为 QuestionId 并查看是否有任何错误消失。如果是这样,您知道这可能是问题的一部分。至于怎么处理FollowupQuestion,我不知道EF是怎么处理的。
  • 将问题中的 ID 重命名为 QuestionId,没有解决任何问题

标签: c# entity-framework table-relationships multiplicity


【解决方案1】:

你觉得这个设计怎么样;)

public class Customer
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CustomerId { get; set; }
    public string CompanyName { get; set; }

    public virtual ICollection<ContactInfo> ContactInfoes { get; set; }
    public virtual ICollection<ProductQuestionaireReport> Reports { get; set; }
}
public class ContactInfo
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key]
    public int ContactInfoId { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public int Telephone { get; set; }

    [ForeignKey("Customer")]
    public int CustomerId { get; set; }
    public virtual Customer Customer { get; set; }
}
public class ProductQuestionaireReport
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ProductQuestionaireReportId { get; set; }

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

    public virtual QuestionaireResult Result { get; set; }

    [ForeignKey("Customer")]
    public int CustomerId { get; set; }
    public virtual Customer Customer { get; set; }

    public bool Haste { get; set; }
    public string Status { get; set; }
    public string Comment { get; set; }
}
public class QuestionaireResult
{
    [Key, ForeignKey("ProductQuestionaireReport")]
    public int ProductQuestionaireReportId { get; set; }

    [ForeignKey("Questionaire")]
    public int QuestionaireId { get; set; }
    public virtual Questionaire Questionaire { get; set; }

    public DateTime SurveyCreated { get; set; }
    public Double Costs { get; set; }
    public Double FunctionPoints { get; set; }

    public virtual ProductQuestionaireReport ProductQuestionaireReport { get; set; }
    public virtual ICollection<QuestionaireAnswer> Answers { get; set; }
}
public class Product
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ProductId { get; set; }
    public string Name { get; set; }
    public string Summary { get; set; }
    public string Examples { get; set; }

    public virtual ICollection<Questionaire> Questionaires { get; set; }
    public virtual ICollection<ProductQuestionaireReport> Reports { get; set; }
}
public class QuestionaireAnswer
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int QuestionaireAnswerId { get; set; }

    [ForeignKey("QuestionaireResult")]
    public int QuestionaireResultId { get; set; }
    public virtual QuestionaireResult QuestionaireResult { get; set; }

    [ForeignKey("QuestionaireQuestion")]
    public int QuestionaireId { get; set; }
    public virtual QuestionaireQuestion QuestionaireQuestion { get; set; }

    [ForeignKey("Answer")]
    public int AnswerId { get; set; }
    public virtual QuestionOption Answer { get; set; }

    public string Text { get; set; }
    public virtual ICollection<string> Files { get; set; }
}
public class Questionaire
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int QuestionaireId { get; set; }
    [ForeignKey("Product")]
    public int ProductId { get; set; }
    public virtual Product Product { get; set; }

    public virtual ICollection<QuestionaireQuestion> QuestionaireQuestions { get; set; }
    public virtual ICollection<QuestionaireResult> Results { get; set; }
}
public class Question
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int QuestionId { get; set; }

    [ForeignKey("ParentQuestion")]
    public int ParentQuestionId { get; set; }
    public virtual Question ParentQuestion { get; set; }

    public virtual QuestionType QuestionType { get; set; }
    public virtual ICollection<QuestionOption> Options { get; set; }
}
public class QuestionType
{
    [Key, ForeignKey("Question")]
    public int QuestionId { get; set; }

    public string Text { get; set; }
    public bool IsOpenQuestion { get; set; }

    public virtual Question Question { get; set; }
}
public class QuestionOption
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int QuestionAnswerOptionId { get; set; }

    [ForeignKey("Question")]
    public int QuestionId { get; set; }
    public string Text { get; set; }

    public virtual Question Question { get; set; }
}
public class QuestionaireQuestion
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int QuestionaireQuestionId { get; set; }

    [ForeignKey("Questionaire")]
    public int QuestionaireId { get; set; }
    public virtual Questionaire Questionaire { get; set; }

    [ForeignKey("Question")]
    public int QuestionId { get; set; }
    public int DisplayOrder { get; set; }

    public virtual Question Question { get; set; }
}

您还必须将此添加到OnModelCreating

modelBuilder.Entity<Customer>().HasMany(c => c.ContactInfoes)
    .WithRequired(i => i.Customer).HasForeignKey(i => i.CustomerId).WillCascadeOnDelete(false);

modelBuilder.Entity<Question>().HasMany(q => q.Options)
    .WithRequired(o => o.Question).HasForeignKey(o => o.QuestionId).WillCascadeOnDelete(false);

modelBuilder.Entity<QuestionaireResult>().HasMany(r => r.Answers)
    .WithRequired(a => a.QuestionaireResult).HasForeignKey(o => o.QuestionaireResultId).WillCascadeOnDelete(false);

检查并反馈给我......

【讨论】:

  • 一个 QuestionGroup 包含一组特定于产品的问题。我明白你想说什么。我认为您的意思是产品应该有一个 Icollection。不知道这将如何解决问题。
  • 嗨@Flippey ...答案实体是什么...?在您的 ERD 中,您有一个答案表,该表是什么?
  • 此 ERD 是否用于产品调查?
  • 这是一项调查,是的。 answer 实体是对问题的回答。
  • 嗨 @Flippey 我认为您的 ERD 设计有问题...检查答案谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 2013-11-30
  • 1970-01-01
相关资源
最近更新 更多