C# 实体框架中的多重性
我是实体框架的新手,在尝试首先实现ERD代码时遇到了一些问题。情况如下: 一个产品有一组问题。一个问题组有多个问题,可以属于多个问题组。问卷基本上有一个问题组和一个问题顺序。问题顺序应该保持问题在该问卷中的位置。因为一个问题组可以有多个问题顺序,并且一个问题顺序可以属于多个问题组,所以需要使用问询表 因为我正在尽我最大的努力保持这篇文章的简洁,除非你要求看,否则我不会发布我所有的课程。我创建的实体类如下所示:C# 实体框架中的多重性,c#,entity-framework,table-relationships,multiplicity,C#,Entity Framework,Table Relationships,Multiplicity,我是实体框架的新手,在尝试首先实现ERD代码时遇到了一些问题。情况如下: 一个产品有一组问题。一个问题组有多个问题,可以属于多个问题组。问卷基本上有一个问题组和一个问题顺序。问题顺序应该保持问题在该问卷中的位置。因为一个问题组可以有多个问题顺序,并且一个问题顺序可以属于多个问题组,所以需要使用问询表 因为我正在尽我最大的努力保持这篇文章的简洁,除非你要求看,否则我不会发布我所有的课程。我创建的实体类如下所示: public class Question { [Key]
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\u Product\u Source::多重性在关系“QuestionGroup\u Product”中的角色“QuestionGroup\u Product\u Source”中无效。因为依赖角色属性不是键属性,所以依赖角色的多重性上限必须为“*”
QuestionOrder\u Questionaire\u Source::多重性在关系“QuestionOrder\u Questionaire”中的角色“QuestionOrder\u Questionaire\u Source”中无效。因为依赖角色属性不是键属性,所以依赖角色的多重性上限必须为“*”
QuestionType\u Question\u Source::多重性在关系“QuestionType\u Question”中的角色“QuestionType\u Question\u Source”中无效。因为依赖角色属性不是键属性,所以依赖角色的多重性上限必须为“*”
我们得出的问题是:
这里有人知道修复我的表之间关系的方法吗?也许我的ERD也需要一些改进,但我认为问题在于我的代码优先实现缺少一些东西。这个设计对您来说怎么样
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; }
}
检查并反馈给我 您是否有其他实体配置?例如,使用Fluent API?不,我没有。我不知道这是怎么回事。缺少产品和问卷的定义。不是100%确定,但可能是因为FK属性名称与键属性名称不相同。我知道这看起来很愚蠢,但请将有问题的Id重命名为QuestionId,看看是否有任何错误消失。如果是这样,你知道这可能是问题的一部分。至于如何处理FollowupQuestion,我不确定EF是如何处理的。另外,将问题中的Id重命名为QuestionId并没有解决任何问题QuestionGroup包含一组特定于产品的问题。我明白你想说什么了。我想你的意思是产品应该有一个Icollection。但不确定这将如何解决问题。嗨@Flippey。。。什么是…的答案实体?在你的ERD中,你有一个答案表,它是什么?这是一个产品调查的ERD吗?这是一种调查是的。答案实体是一个问题的答案。嗨@Flippey我想你的ERD设计有问题。。。检查答案,谢谢。
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);