我想创建一个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;不可用。
答案 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相同,因为在一对一的关系中,您不能在辅助表中拥有主键。
次要实体被视为主要实体的扩展。