我見過類似的問題,但似乎都與我的問題無關。
我有 2 個物體、EducationResult鏈接TestModule和Student附加資訊,
以及TestModule對這些問題的Questions深入了解。Answers
當嘗試再次將相同的 TestModule 與相同的 Student 鏈接時,我收到錯誤:
重復鍵值違反唯一約束“IX_EducationResults_TestModuleId”
我不認為 TestModule 物體是唯一的,問題肯定在于配置。
EducationResult:
public class EducationResult : AuditableEntity
{
public EducationResultId EducationResultId { get; set; }
public IsDone IsDone { get; set; }
public Score Score { get; set; }
public MaxScore MaxScore { get; set; }
public IsPassed IsPassed { get; set; }
// Student
public StudentId StudentId { get; set; }
public virtual Student Student { get; set; }
// TestModule
public TestModuleId TestModuleId { get; set; }
public virtual TestModule TestModule { get; set; }
}
TestModule:
public class TestModule : AuditableEntity
{
public TestModuleId TestModuleId { get; set; }
public TestModuleName Name { get; set; }
public TestModuleLevel Level { get; set; }
public TestModuleDescription Description { get; set; }
public ICollection<Question> Questions { get; set; }
}
和配置:
public class EducationResultConfiguration : IEntityTypeConfiguration<EducationResult>
{
public void Configure(EntityTypeBuilder<EducationResult> builder)
{
builder.HasKey(x => x.EducationResultId);
builder.Property(x => x.EducationResultId)
.HasConversion(x => x.Value, x => new EducationResultId(x));
builder.Property(x => x.IsDone)
.HasConversion(x => x.Value, x => new IsDone(x));
builder.Property(x => x.Score)
.HasConversion(x => x.Value, x => new Score(x));
builder.Property(x => x.MaxScore)
.HasConversion(x => x.Value, x => new MaxScore(x));
builder.Property(x => x.IsPassed)
.HasConversion(x => x.Value, x => new IsPassed(x));
// Entity configurations
builder
.HasOne(x => x.Student)
.WithMany(x => x.EducationResults)
.HasForeignKey(q => q.StudentId);
builder
.HasOne(x => x.TestModule)
.WithOne()
.HasForeignKey<EducationResult>(x => x.TestModuleId);
}
}
public class TestModuleConfiguration : IEntityTypeConfiguration<TestModule>
{
public void Configure(EntityTypeBuilder<TestModule> builder)
{
builder.HasKey(x => x.TestModuleId);
builder.Property(x => x.TestModuleId)
.HasConversion(x => x.Value, x => new TestModuleId(x));
builder.Property(x => x.Name)
.HasConversion(x => x.Value, x => new TestModuleName(x));
builder.Property(x => x.Level)
.HasConversion(x => x.Value, x => new TestModuleLevel(x));
builder.Property(x => x.Description)
.HasConversion(x => x.Value, x => new TestModuleDescription(x));
builder
.OwnsMany(module => module.Questions, question =>
{
#region Question owner
question.WithOwner(x => x.TestModule).HasForeignKey(x => x.TestModuleId);
#endregion
#region Question properties
question.HasKey(x => x.QuestionId);
question.Property(x => x.QuestionId)
.HasConversion(x => x.Value, x => new QuestionId(x));
question.Property(x => x.QuestionText)
.HasConversion(x => x.Value, x => new QuestionText(x));
question.Property(x => x.Explanation)
.HasConversion(x => x.Value, x => new QuestionExplanation(x));
question.Property(x => x.TestModuleId)
.HasConversion(x => x.Value, x => new TestModuleId(x));
#endregion
question.OwnsMany(x => x.Answers, answer =>
{
#region Answer owner
answer.WithOwner(x => x.Question).HasForeignKey(x => x.QuestionId);
#endregion
#region Answer properties
answer.HasKey(x => x.QuestionAnswerId);
answer.Property(x => x.QuestionAnswerId)
.HasConversion(x => x.Value, x => new QuestionAnswerId(x));
answer.Property(x => x.Text)
.HasConversion(x => x.Value, x => new QuestionAnswerText(x));
answer.Property(x => x.IsCorrect)
.HasConversion(x => x.Value, x => new Correct(x));
answer.Property(x => x.QuestionId)
.HasConversion(x => x.Value, x => new QuestionId(x));
#endregion
});
});
}
}
和錯誤:
保存背景關系型別“wisse.Persistence.DAL.WisseDbContext”的更改時,資料庫中發生例外。Microsoft.EntityFrameworkCore.DbUpdateException:保存物體更改時出錯。有關詳細資訊,請參閱內部例外。---> Npgsql.PostgresException (0x80004005): 23505: 重復鍵值違反唯一約束“IX_EducationResults_TestModuleId”
我想使用 TestModule 內容,比如代碼中的靜態欄位,
這些值應該是可重用的,即使它們已經在 EducationResult 中使用過 有
什么問題以及如何允許多次使用同一個物體?
uj5u.com熱心網友回復:
您已經為 EducationResult 和 TestModule 宣告了 1:1 的關系:
public void Configure(EntityTypeBuilder<EducationResult> builder)
{
...
builder
.HasOne(x => x.TestModule) // EducationResult can have one TestResult
.WithOne() // TestResult can have ONE EducationResult
.HasForeignKey<EducationResult>(x => x.TestModuleId);
}
在這種情況下,EF Core 將生成一個約束以確保僅在一個 EducationResult 中參考一個 TestModule。
對于 TestModule 可以在 EducationResult 中多次參考,您需要宣告一個關系 1:n :
public void Configure(EntityTypeBuilder<EducationResult> builder)
{
...
builder
.HasOne(x => x.TestModule) // EducationResult can have one TestResult
.WithMany() // TestResult can have MANY EducationResult
.HasForeignKey<EducationResult>(x => x.TestModuleId);
}
就像你對關系 EducationResult|Student 所做的那樣,一個學生可以有多個結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/514689.html
