尝试创建数据库时收到以下错误:
在模型生成过程中检测到一个或多个验证错误:
Interaction_CauseElement_Source::多重性在关系'Interaction_CauseElement'中的角色'Interaction_CauseElement_Source'中无效。因为从属角色属性不是关键属性,所以从属角色多重性的上限必须为'*'。
Interaction_EffectElement_Source::多重性在关系'Interaction_EffectElement'中的角色'Interaction_EffectElement_Source'中无效。因为从属角色属性不是关键属性,所以从属角色多重性的上限必须为'*'。
我在其他Stack Overflow帖子中也看到了此错误,但是在我发现的示例中,OP试图在表之间的两个方向上建立1对1的关系。那不是我想要的。
这是我的模型:
public class Element
{
[Key]
public int ID { get; set; }
[Required, MaxLength(64)]
public string Name { get; set; }
[MaxLength(200)]
public string Description { get; set; }
}
public class Interaction
{
[Key]
public int ID { get; set; }
[Index, Required]
public int CauseID { get; set; }
[Index, Required]
public int EffectID { get; set; }
[MaxLength(64)]
public string Location { get; set; }
[ForeignKey("CauseID")]
public virtual Element CauseElement { get; set; }
[ForeignKey("EffectID")]
public virtual Element EffectElement { get; set; }
}
Elements表中的项目是唯一的。一对元素可以在任意数量的位置相互交互。CauseID / EffectID对将不是唯一的。
我要更改模型的唯一其他地方是该OnModelCreating
方法。我收到此错误:
在表“交互”上引入外键约束“ FK_dbo.Interactions_dbo.Elements_Cause”可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。无法创建约束。请参阅先前的错误。
并且不得不为模型创建一个级联策略。此代码修复了该错误:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//Prevent cyclic cascade on elements table
modelBuilder.Entity<Interaction>()
.HasRequired(i => i.CauseElement)
.WithRequiredDependent()
.WillCascadeOnDelete(false);
modelBuilder.Entity<Interaction>()
.HasRequired(i => i.EffectElement)
.WithRequiredDependent()
.WillCascadeOnDelete(false);
base.OnModelCreating(modelBuilder);
}
但是后来我收到了神秘的“多重性”错误。似乎希望我将其public virtual Element CauseElement
放入像这样的集合中public virtual ICollection<Element> CauseElement
,但这无法正确地建立关系模型。
我找到了解决方案。EntityFrameworkTutoral.net上的这篇文章有所帮助。因为我需要从Interaction
类到Element
类的两个引用,所以这种关系太复杂了,无法在仅具有属性的EF中进行建模。
我必须更新模型,然后使用流畅的API告诉EF如何处理这些关系。我将模型更新为以下内容:
public class Element
{
public Element()
{
CauseElements = new List<Interaction>();
EffectElements = new List<Interaction>();
}
[Key]
public int ID { get; set; }
[Required, MaxLength(64)]
public string Name { get; set; }
#region Navigation
public virtual ICollection<Interaction> CauseElements { get; set; }
public virtual ICollection<Interaction> EffectElements { get; set; }
#endregion
}
public class Interaction
{
[Key]
public int ID { get; set; }
[Index]
public int CauseID { get; set; }
[Index]
public int EffectID { get; set; }
[MaxLength(64)]
public string Location { get; set; }
#region Navigation
[ForeignKey("CauseID")]
public virtual Element CauseElement { get; set; }
[ForeignKey("EffectID")]
public virtual Element EffectElement { get; set; }
#endregion
}
在我的DbContext类中,我使用了流畅的API在Interaction.CauseElement
andElement.CauseElements
和之间创建了链接,其中属性是Interaction
表的外键(与Effect关系相同):
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//Prevent cyclic cascade on elements table
modelBuilder.Entity<Interaction>()
.HasRequired(i => i.CauseElement)
.WithRequiredDependent()
.WillCascadeOnDelete(false);
modelBuilder.Entity<Interaction>()
.HasRequired(i => i.EffectElement)
.WithRequiredDependent()
.WillCascadeOnDelete(false);
//Create the links between the element, the key, and the collection
modelBuilder.Entity<Interaction>()
.HasRequired<Element>(i => i.CauseElement)
.WithMany(e => e.CauseElements)
.HasForeignKey(i => i.CauseID);
modelBuilder.Entity<Interaction>()
.HasRequired<Element>(i => i.EffectElement)
.WithMany(e => e.EffectElements)
.HasForeignKey(i => i.EffectID);
base.OnModelCreating(modelBuilder);
}
看起来,当您具有简单的一对多关系时,Entity Framework会尝试自动推断表之间的关系。如果我删除EffectElement
从Interaction
类(EffectElements
从Element
),EF能够轻松地创建关系。但是,当我重新添加它时,我再次收到错误。
由于该Element
类型在Interaction
班级中出现过两次,因此它不知道如何创建关系。我必须在OnModelCreating
方法中明确定义它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句