首页 文章

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

提问于
浏览
0

如果数据库体系结构是这样的,我将如何使用流畅的API创建映射?

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或数据注释显式配置此关联的主要结尾 .

2 回答

  • 0

    你的多元化让你觉得你正在处理集合,但除此之外你可以尝试类似的东西:

    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

  • 0

    谢谢您的回复 .

    我添加了这个配置

    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:Name:类型中的每个属性名称必须是唯一的 . 已定义属性名称“AddressId” . Id:名称:类型中的每个属性名称必须是唯一的 . 已定义属性名称“Id” . AddressId:Name:类型中的每个属性名称必须是唯一的 . 已定义属性名称“AddressId” . Id:名称:类型中的每个属性名称必须是唯一的 . 已定义属性名称“Id” .

相关问题