gpt4 book ai didi

c# - EF 代码优先 : Multiplicity constraint violation

转载 作者:太空狗 更新时间:2023-10-29 21:39:48 25 4
gpt4 key购买 nike

帮助! - 我在导航模型 ArticleType 上收到以下错误:

A relationship multiplicity constraint violation occurred

这是现有的数据库架构:

database model

这是我的代码:

public class Article
{
public int ID { get; set; }
public virtual Stage Stage { get; set; }
public virtual ArticleType ArticleType { get; set; } // Causes the violation
}

public class ArticleType
{
public int ID { get; set; }
public string Title { get; set; }
}

public class Stage
{
public int ID { get; set; }
public string Title { get; set; }
}

我使用 fluent api 进行映射,这是协会的摘录

// This works
modelBuilder.Entity<Article>
.HasRequired(t => t.Stage)
.WithMany() // if turned .WithOptional() then will also cause the error.
.Map(m => m.MapKey("stage_id"));

// This does not work
modelBuilder.Entity<Article>
.HasRequired(t => t.ArticleType)
.WithMany()
.Map(m => m.MapKey("article_type_id"));

我的问题是,为什么 ArticleType 导致了错误,而 Stage 却没有,即使两者的声明和映射在语法上相同?

编辑 1

我通过悬停鼠标检查 Article 对象发现了异常(不确定确切的术语)

open image to new tabe

错误详情

System.InvalidOperationException was unhandled by user code
HResult=-2146233079
Message=A relationship multiplicity constraint violation occurred: An EntityReference can have no more than one related object, but the query returned more than one related object. This is a non-recoverable error.
Source=System.Data.Entity
StackTrace:
at System.Data.Objects.DataClasses.EntityReference`1.Load(MergeOption mergeOption)
at System.Data.Objects.DataClasses.RelatedEnd.Load()
at System.Data.Objects.DataClasses.RelatedEnd.DeferredLoad()
at System.Data.Objects.Internal.LazyLoadBehavior.LoadProperty[TItem](TItem propertyValue, String relationshipName, String targetRoleName, Boolean mustBeNull, Object wrapperObject)
at System.Data.Objects.Internal.LazyLoadBehavior.<>c__DisplayClass7`2.<GetInterceptorDelegate>b__2(TProxy proxy, TItem item)
at System.Data.Entity.DynamicProxies.Package_A18FADC105CCF13C9CD346622D43BD35514E489CCC1E5B1E4A3C78806BDCA0F5.get_ArticleType()
at AuthorProofing.Service.ReminderService.DeliverDailyReminders() in C:\Users\default.Lenovo-PC\Documents\Visual Studio 2010\Projects\AuthorProofing\AuthorProofing.Service\ReminderService.cs:line 36
at AuthorProofing.Tests.ReminderServiceTest.DeliverDailyRemindersTest() in C:\Users\default.Lenovo-PC\Documents\Visual Studio 2010\Projects\AuthorProofing\AuthorProofing.Tests\ReminderServiceTest.cs:line 76
InnerException:

编辑 2

我决定使用显式外键关联。

class ArticleMap : EntityTypeConfiguration<Article>
{
public ArticleMap()
{
// Primary Key
this.HasKey(t => t.ID);
this.Property(t => t.ID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

// Strongly typed FK properties
this.Property(t => t.StageID).IsRequired();
this.Property(t => t.ArticleTypeID).IsRequired();

// Navigation Models
this.HasRequired(t => t.Stage);
this.HasRequired(t => t.ArticleType);

// Table & Column Mappings
this.ToTable("items");
this.Property(t => t.ID).HasColumnName("item_id");
this.Property(t => t.StageID).HasColumnName("stage_id");
this.Property(t => t.ArticleTypeID).HasColumnName("article_type_id");
}
}


protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ArticleTypeMap());
modelBuilder.Configurations.Add(new StageMap());
modelBuilder.Configurations.Add(new ArticleMap());
}

还是不行。

使用新的外键映射方法,我尝试切换键 article_type_idstage_id

this.Property(t => t.StageID).HasColumnName("article_type_id"); // <-- Switched
this.Property(t => t.ArticleTypeID).HasColumnName("stage_id"); // <-- Switched

突然,错误消失了。目前一头雾水。我认为 ArticleType 模型不喜欢外键“article_type_id”。

编辑 3

在我的导航模型映射中添加 .HasForeignKey(...) 后,我收到一个新错误:Unknown column 'ArticleType_ID' in 'field list'

class ArticleMap : EntityTypeConfiguration<Article>
{
public ArticleMap()
{
// Primary Key
this.HasKey(t => t.ID);
this.Property(t => t.ID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

// Foreign Key Properties
this.Property(t => t.StageID)
.IsRequired();
this.Property(t => t.JournalID)
.IsRequired();
this.Property(t => t.ArticleTypeID)
.IsRequired();

// Navigational Models
this.HasRequired(t => t.Stage); // This works
this.HasRequired(t => t.ArticleType)
.WithMany()
.HasForeignKey(t => t.ArticleTypeID); // Newly added

// Table & Column Mappings
this.ToTable("items");
this.Property(t => t.ID).HasColumnName("item_id");
this.Property(t => t.ArticleTypeID).HasColumnName("article_type_id");
this.Property(t => t.StageID).HasColumnName("stage_id");
}
}

class ArticleTypeMap : EntityTypeConfiguration<ArticleType>
{
public ArticleTypeMap()
{
// Primary Key
this.HasKey(t => t.ID);

// Properties
this.Property(t => t.ID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

this.Property(t => t.Title)
.HasMaxLength(100)
.IsRequired();

// Table & Column Mappings
this.ToTable("article_types");
this.Property(t => t.ID).HasColumnName("article_type_id"); // <-- Apparently, this is no longer mapped.
this.Property(t => t.Title).HasColumnName("title");
}
}

最佳答案

在谷歌搜索特定错误消息a时,原因是错误地将一对多关系配置为一对一关系,方法是使用:

modelBuilder.Entity<Article>
.HasRequired(t => t.ArticleType)
.WithOptional()
.HasForeignKey(...);

虽然它应该是:

modelBuilder.Entity<Article>
.HasRequired(t => t.ArticleType)
.WithMany()
.HasForeignKey(...);

您已经在自己的代码示例中指出了这一点。由于 您为 ArticleTypeStage 显示的代码 是相同的,因此 此代码 是问题的原因。在代码的其他地方,ArticleArticleType 之间必须定义一对一的关系。或者在某种程度上,您最初的关系是错误的,但 Entity Framework 没有选择更正的流畅定义。

关于c# - EF 代码优先 : Multiplicity constraint violation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18798739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com