Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用实体框架在两个表上正确添加多个一对一关系?_C#_Entity Framework - Fatal编程技术网

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);