我正在使用asp core 2.0开发语言词典。我不知道该怎么做 正确设计我的数据库。我遇到了类似的问题:How to design a database for translation dictionary?。
我决定创建一个如下图所示的数据库:
database structure that i wanna realize in ef core
但我不知道如何用实体框架核心2.0实现这种结构。
Word实体
public class Word
{
public Word()
{
Translations = new HashSet<Translation>();
}
[Key]
public Guid WordId { get; set; }
[Required]
public Guid LangCodeId { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage",
"CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Translation> Translations { get; set; }
}
翻译实体
public class Translation
{
[Key]
public Guid TranslationId { get; set; }
public Guid WordId1 { get; set; }
public Guid WordId2 { get; set; }
//[ForeignKey("WordId1,WordId2")]
public Word Words { get; set; }
}
流畅的API
modelBuilder.Entity<Translation>()
.HasOne(w => w.Words)
.WithMany(m => m.Translations)
.HasForeignKey(fk => new { fk.WordId1, fk.WordId2 });
当我尝试添加迁移时,我收到错误:
The relationship from 'Translation.Words' to 'Word.Translations' with
foreign key properties {'WordId1' : Guid, 'WordId2' : Guid} cannot target
the primary key {'WordId' : Guid} because it is not compatible. Configure
a principal key or a set of compatible foreign key properties for this
relationship.
答案 0 :(得分:0)
我找到了解决方案
public partial class Translation
{
public Guid DerivedId { get; set; }
public Guid? Word1 { get; set; }
public Guid? Word2 { get; set; }
public Word Word1Navigation { get; set; }
public Word Word2Navigation { get; set; }
}
public partial class Word
{
public Word()
{
TranslationWord1Navigation = new HashSet<Translation>();
TranslationWord2Navigation = new HashSet<Translation>();
}
public Guid Id { get; set; }
public ICollection<Translation> TranslationWord1Navigation { get; set; }
public ICollection<Translation> TranslationWord2Navigation { get; set; }
}
Fluent API
modelBuilder.Entity<Translation>(entity =>
{
entity.HasKey(e => e.DerivedId);
entity.Property(e => e.DerivedId).ValueGeneratedNever();
entity.HasOne(d => d.Word1Navigation)
.WithMany(p => p.TranslationWord1Navigation)
.HasForeignKey(d => d.Word1)
.HasConstraintName("FK__DerivedTa__Word1__5EBF139D");
entity.HasOne(d => d.Word2Navigation)
.WithMany(p => p.TranslationWord2Navigation)
.HasForeignKey(d => d.Word2)
.HasConstraintName("FK__DerivedTa__Word2__5FB337D6");
});
modelBuilder.Entity<Word>(entity =>
{
entity.Property(e => e.Id)
.HasColumnName("id")
.ValueGeneratedNever();
});