【问题标题】:EF Code first parent child mappingEF Code第一父子映射
【发布时间】:2012-06-13 16:38:13
【问题描述】:

这可能是一个重复的 qn,但我无法得到这个场景的正确答案。我有以下表结构:

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 ) 如何在 fluent Api 中指定此映射,以便我可以为每个 File 对象加载“FileLLocalCollection”?

【问题讨论】:

    标签: entity-framework ef-code-first


    【解决方案1】:

    映射的第一部分可以这样完成:

    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);
    

    【讨论】:

    • 在这种情况下,您的 FileLocal 必须只有 FileId 作为 PK,或者您的 File 的 PK 中也必须有 LangId。
    • 我现在基本上有这样的场景。没有 LangID.. ,public class File { public int FileId { get;放; } //PK public int VersionID { get;放; } 公共虚拟 FileDetail FileDetails { 获取;放; } } 公共类 FileDetail { 公共 int FileId { 获取;放; } //PK, FK public string FileName { get;放; },。它基本上是一对一的映射,其中 FileId 是第二个表的 PK 和 FK,例如详细表。现在我如何使用每个 File 对象加载 FileDetail
    • 为了清晰起见我的课程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; } }
    • 谢谢拉迪斯拉夫。我想通了,基本上 HasRequired(e => e.FileDetails).WithRequiredPrincipal();为我工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多