EF Code first 父子映射

3
这可能是一个重复的问题,但我无法得到一个合适的答案来解决这个场景。我有以下的表结构:
public class File
{
     public int FileId { get; set; } //PK
     public int VersionID { get; set; }

     public virtual ICollection<FileLocal> FileLLocalCollection { get; set; }
}

public class FileLocal
{
     public int FileId { get; set; } //PK, FK
     public int LangID { get; set; } //PK,FK
     public string FileName { get; set; }
}

这里没有包含第三个表格(基本上是LangID(PK)和LangCode) 我该如何在流畅API中指定此映射,以便我可以使用每个文件对象加载“FileLLocalCollection”?

1个回答

4
你可以这样完成映射的第一部分:
modelBuilder.Entity<File>()
    .HasMany(f => f.FileLocalCollection)
    .WithRequired()
    .HasForeignKey(fl => fl.FileId);

modelBuilder.Entity<FileLocal>()
    .HasKey(fl => new {fl.FileId, fl.LangId});

第二部分取决于您定义 Lang 的方式。例如,如果您从 FileLocal 添加导航属性到 Lang ,则可以按照以下方式进行映射:

modelBuilder.Entity<FileLocal>()
    .HasRequired(fl => fl.Lang)
    .WithMany()
    .HasForeignKey(fl => fl.LangId);

如果关系是一对一,而不是“public virtual ICollection<FileLocal> FileLLocalCollection”,那么属性应该是“public virtual FileLocal FileLLocal”。 - user396491
在这种情况下,您的FileLocal必须只有FileId作为主键,或者您的File还必须在其主键中包含LangId。 - Ladislav Mrnka
我现在有这样的场景。没有LangID..,公共类文件 { public int FileId { get; set; } //PK public int VersionID { get; set; } public virtual FileDetail FileDetails { get; set; }}公共类FileDetail { public int FileId { get; set; } //PK, FK public string FileName { get; set; } }, 它基本上是一对一映射,其中FileId是第二个表的主键和外键,就像详细表一样。现在如何使用每个文件对象加载FileDetail? - user396491
为了更好地阐明,这里是我的类:public class File { public int FileId { get; set; } //PK public int VersionID { get; set; } public virtual FileDetail FileDetails { get; set; } } public class FileDetail { public int FileId { get; set; } //PK, FK public string FileName { get; set; } } - user396491
谢谢Ladislav。我已经弄清楚了,基本上HasRequired(e => e.FileDetails).WithRequiredPrincipal();对我有用。 - user396491

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接