使用 Fluent API 的 EF Code First 1 对 1 映射

EF Code First 1 to 1 mapping using Fluent API

How am I going to create the mapping using fluent API if the database architecture is something like this?

public class Users 
{
    public Users() 
    {            
        PermanentAddresses = new PermanentAddresses();
        TemporaryAddresses = new TemporaryAddresses();
    }
    public int Id { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }   
    public virtual PermanentAddresses PermanentAddresses { get; set; }
    public virtual TemporaryAddresses TemporaryAddresses { get; set; }
} 

public class PermanentAddresses 
{
    // Primary Key and Foreign Key from Users class
    public string Id { get; set; }
    // Primary Key and Foreign Key from Addresses class
    public int AddressId { get; set; }
    public virtual Users Users { get; set; }
    public virtual Addresses Addresses { get; set; }
}

public class TemporaryAddresses 
{
    // Primary Key and Foreign Key from Users class
    public string Id { get; set; }
    // Primary Key and Foreign Key from Addresses class
    public int AddressId { get; set; }
    public virtual Users Users { get; set; }
    public virtual Addresses Addresses { get; set; }
}

public class Addresses
{
    public Addresses()
    {
        PermanentAddresses = new PermanentAddresses();
        TemporaryAddresses = new TemporaryAddresses();
        Company = new Company();
    }
    public int Id { get; set; }    
    public string CompleteAddress { get; set; } 
    public virtual PermanentAddresses PermanentAddresses { get; set; }
    public virtual TemporaryAddresses TemporaryAddresses { get; set; }
    public virtual Company Company { get; set; }
}   

我遇到了这个错误。

无法确定类型 'PermanentAddresses' 和 'Addresses' 之间关联的主体端。此关联的主体端必须使用流畅的关系 API 或数据注释进行显式配置。

你的多元化让你看起来像是在处理集合,但除此之外你可以尝试类似的东西:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<PermanentAddresses>()
        .HasRequired(pa => pa.Users)
        .WithRequiredDependent(u => u.PermanentAddresses);

    modelBuilder.Entity<TemporaryAddresses>()
        .HasRequired(pa => pa.Users)
        .WithRequiredDependent(u => u.TemporaryAddresses);

    modelBuilder.Entity<PermanentAddresses>()
        .HasRequired(pa => pa.Addresses)
        .WithRequiredDependent(u => u.PermanentAddresses);

    modelBuilder.Entity<TemporaryAddresses>()
        .HasRequired(pa => pa.Addresses)
        .WithRequiredDependent(u => u.TemporaryAddresses);
}

https://www.safaribooksonline.com/library/view/programming-entity-framework/9781449317867/ch04s07.html

感谢您的回复。

我添加了这个配置

modelBuilder.Entity<PermanentAddresses>().ToTable("PermanentAddresses", "user");
modelBuilder.Entity<PermanentAddresses>().HasKey(x => new { x.Id, x.AddressId });

modelBuilder.Entity<TemporaryAddresses>().ToTable("TemporaryAddresses", "user");
modelBuilder.Entity<TemporaryAddresses>().HasKey(x => new { x.Id, x.AddressId });

请检查这个 generated Tables and Columns

我想将 "Addresses_Id" 指向 "AddressId" "Users_Id" 到 "Id"

但是,如果我尝试添加 .Map(p => p.MapKey("Id")); .Map(p => p.MapKey("AddressId")); 像这样

modelBuilder.Entity<PermanentAddresses>().HasRequired(pa => pa.Users).WithRequiredDependent(u => u.PermanentAddresses).Map(p => p.MapKey("Id"));
modelBuilder.Entity<PermanentAddresses>().HasRequired(pa => pa.Addresses).WithRequiredDependent(u => u.PermanentAddresses).Map(p => p.MapKey("AddressId"));
modelBuilder.Entity<TemporaryAddresses>().HasRequired(pa => pa.Users).WithRequiredDependent(u => u.TemporaryAddresses).Map(p => p.MapKey("Id"));
modelBuilder.Entity<TemporaryAddresses>().HasRequired(pa => pa.Addresses).WithRequiredDependent(u => u.TemporaryAddresses).Map(p => p.MapKey("AddressId"));

我收到一个错误。

在模型生成过程中检测到一个或多个验证错误:

AddressId: 名称:类型中的每个 属性 名称都必须是唯一的。 属性 名称 'AddressId' 已经定义。 Id: 名称:类型中的每个 属性 名称必须是唯一的。 属性 名称 'Id' 已经定义。 AddressId: 名称:类型中的每个 属性 名称必须是唯一的。 属性 名称 'AddressId' 已经定义。 Id: 名称:类型中的每个 属性 名称必须是唯一的。 属性 名称 'Id' 已经定义。