如何使用Entity Framework在两个表上正确添加多个一对一关系?

时间:2014-05-20 13:28:15

标签: c# entity-framework

我想创建一个Lighthead类,它与Lens类有两个一对一的关系。当我按照下面的设置映射类时,我收到以下错误。

  

操作失败,因为名称为' IX_Id'的索引或统计信息已存在于桌面' dbo.Lens'。

我该如何解决这个问题?

这是我的映射

public class LensMap : EntityTypeConfiguration<Lens>
{
    public LensMap()
    {
        // Primary Key
        this.HasKey(t => t.Id);

        // Properties
        this.Property(t => t.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        // Table & Column Mappings
        this.ToTable("Lens");
        this.Property(t => t.Id).HasColumnName("Id");

        // Relationships
        this.HasRequired(t => t.LightHead)
            .WithOptional(t => t.Lens);
        this.HasRequired(t => t.LightHead1)
            .WithOptional(t => t.Lens1);
    }
}

这是我的lens班级

public class Lens
{
    public int Id { get; set; }
    public virtual LightHead LightHead { get; set; }
    public virtual LightHead LightHead1 { get; set; }
}

这是我的lighthead班级

public class LightHead
{
    public int Id { get; set; }
    public virtual Lens Lens { get; set; }
    public virtual Lens Lens1 { get; set; }
}

注意我正在使用Entity Framework 6和C#

我也尝试在Lens类中使用一个LightHead执行此操作,它返回以下错误

指定的架构无效。错误:关系&#39; WebApplication2.Models.LightHead_Lens&#39;没有加载,因为类型&#39; WebApplication2.Models.Lens&#39;不可用。

3 个答案:

答案 0 :(得分:0)

或者,您可以使用实体框架table splitting功能将两个实体映射到单个表。

这也允许您将部分表列查询为单个实体,以提高性能。

答案 1 :(得分:0)

我相信你需要一个外键。

    // Relationships
    this.HasRequired(t => t.LightHead)
        .WithOptional(t => t.Lens)
        .HasForeignKey(t => t.LightHeadId)
    this.HasRequired(t => t.LightHead1)
        .WithOptional(t => t.Lens1);
        .HasForeignKey(t => t.LightHead1Id)

...

public class Lens
{
    public int Id { get; set; }
    public int LightHeadId {get;set;}
    public int LightHead1Id {get;set;}

    public virtual LightHead LightHead { get; set; }
    public virtual LightHead LightHead1 { get; set; }
}

public class LightHead
{
    public int Id { get; set; }

    public virtual Lens Lens { get; set; }
    public virtual Lens Lens1 { get; set; }
}

答案 2 :(得分:0)

所以你的映射应该如下

modelBuilder.Entity<LightHead>.HasOptional(x=> x.Lens).WithRequired(a=> a.LightHead);
modelBuilder.Entity<LightHead>.HasOptional(x=> x.Lens1).WithRequired(a => a.LightHead1);
modelBuilder.Entity<Lens>().Property(x=> x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

您需要将databaseGeneratedOption设置为None,因为Lens的ID与LightHead的Id相同,因为在一对一的关系中,您不能在辅助表中拥有主键。

次要实体被视为主要实体的扩展。