C# 如何使用实体框架在两个表上正确添加多个一对一关系?
我想创建一个C# 如何使用实体框架在两个表上正确添加多个一对一关系?,c#,entity-framework,C#,Entity Framework,我想创建一个Lighthead类,它与Lens类有两个一对一的关系。当我映射下面设置的类时,我收到以下错误 操作失败,因为表“dbo.Lens”上已存在名为“IX_Id”的索引或统计信息 我该如何解决这个问题 这是我的地图 public class LensMap : EntityTypeConfiguration<Lens> { public LensMap() { // Primary Key this.HasKey(t =>
Lighthead
类,它与Lens
类有两个一对一的关系。当我映射下面设置的类时,我收到以下错误
操作失败,因为表“dbo.Lens”上已存在名为“IX_Id”的索引或统计信息
我该如何解决这个问题
这是我的地图
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);
}
}
这是我的lighthead
课程
public class Lens
{
public int Id { 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; }
}
注意我使用的是实体框架6和C#
我也尝试过在Lens类中使用一个光头,它返回以下错误
指定的架构无效。错误:未加载关系“WebApplication2.Models.LightHead\u Lens”,因为类型“WebApplication2.Models.Lens”不可用。或者,您可以使用实体框架功能将两个实体映射到单个表
这还允许您将部分表列作为单个实体进行查询,以提高性能。我相信您需要一个foreing键
// 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)
因此,您的映射应该如下所示
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);
modelBuilder.Entity.has可选(x=>x.Lens).WithRequired(a=>a.LightHead);
modelBuilder.Entity.HasOptional(x=>x.Lens1).WithRequired(a=>a.LightHead1);
modelBuilder.Entity().Property(x=>x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
您需要将databaseGeneratedOption设置为None,因为Lens的Id将与LightHead的Id相同,因为在一对一关系中,辅助表中不能有主键
次要实体被视为主要实体的扩展。您的
Lens
类应该只有一个LightHead
属性。或者,你可以让它包含一个ICollection
或IEnumerable
添加外键使数据库中的关系都是一对多的。这基本上就是我所拥有的,它会产生我在问题中所述的错误。这里还有一个逻辑问题,即两个属性引用同一个表,我相信正是因为如此你想做什么不可能。问题是,当您加载了这两个属性时,它们都将具有与LensHead相同的Id,并且不可能在同一个表中多次存储同一主键。我知道你可以在SQL中创建多个一对零的关系,尽管我不知道EF是否支持这种情况
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);