C# 通过外键进行实体框架代码优先映射

C# 通过外键进行实体框架代码优先映射,c#,entity-framework,linq-to-sql,orm,C#,Entity Framework,Linq To Sql,Orm,我有以下表格: Document (Id int PK, LatestVersionId int FK) DocumentVersion (Id int PK, DocumentId int FK) 文档可以有一个或多个版本,同时一个版本属于一个文档。 我有以下课程: public class Document { public int Id {get;set;} public int LatestVersionId {get;set;} public Document

我有以下表格:

Document (Id int PK, LatestVersionId int FK)
DocumentVersion (Id int PK, DocumentId int FK)
文档可以有一个或多个版本,同时一个版本属于一个文档。 我有以下课程:

public class Document {
    public int Id {get;set;}
    public int LatestVersionId {get;set;}
    public DocumentVersion LatestVersion {get;set;}
}
public class DocumentVersion {
    public int Id {get;set;}
    public int DocumentId {get;set;}
    public Document Document {get;set;}
}
当前映射:

HasOptional(t => t.LatestVersion).WithRequired(t => t.Document).Map(t => t.MapKey("DocumentId")) // DocumentMap
HasRequired(t => t.Document).WithOptional(t => t.LatestVersion).Map(t => t.MapKey("LatestVersionId")); // DocumentVersionMap
我收到以下异常:System.InvalidOperationException:在类型“DocumentVersion”上声明的导航属性“Document”已配置有冲突的映射信息


我应该如何映射这些关系?

您可以按如下方式更新您的类定义:

public class Document {
    [Key]
    public int Id {get;set;}

    public List<DocumentVersion> DocumentVersions {get;set;}
}

public class DocumentVersion {
    [Key]
    public int Id {get;set;}

    [ForeignKey("Document")] 
    public int DocumentId {get;set;}

    public Document Document {get;set;}
}
公共类文档{
[关键]
公共int Id{get;set;}
公共列表文档版本{get;set;}
}
公共类文档版本{
[关键]
公共int Id{get;set;}
[外键(“文件”)]
public int DocumentId{get;set;}
公共文档文档{get;set;}
}
Fluent API:

modelBuilder.Entity<Document>()
            .HasMany(d => d.DocumentVersions)
            .WithRequired(version => version.Document)
            .HasForeignKey(version => version.DocumentId);
modelBuilder.Entity()
.HasMany(d=>d.DocumentVersions)
.WithRequired(版本=>version.Document)
.HasForeignKey(版本=>version.DocumentId);

恐怕我不能更改类定义。这些类在某些集成服务中使用,代码不包含在测试中。@Daemon025但根据您的定义,文档只能有一个版本:
public DocumentVersion LatestVersion{get;set;}
是的,它是。在本例中,我使用HasOptional,因为有些文档没有版本。