Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.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/8/linq/3.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#_Linq_Entity Framework_Linq To Entities - Fatal编程技术网

C# 实体框架多对象关系

C# 实体框架多对象关系,c#,linq,entity-framework,linq-to-entities,C#,Linq,Entity Framework,Linq To Entities,我有一个表,其中有两个外键指向同一父表Edge.StartStationId和Edge.EndStationId 我试图在实体框架中将SE映射到对象,但找不到解决问题的方法。 我发现了一些解决方案,在父站点(Station)上使用了2个集合,我对此不感兴趣 车站(家长)等级: 边贴图类,在OnModelCreating中添加 public EdgeMap() { // Primary Key this.HasKey(t => t.ID); // Propertie

我有一个表,其中有两个外键指向同一父表Edge.StartStationId和Edge.EndStationId

我试图在实体框架中将SE映射到对象,但找不到解决问题的方法。 我发现了一些解决方案,在父站点(Station)上使用了2个集合,我对此不感兴趣

车站(家长)等级:

边贴图类,在OnModelCreating中添加

public EdgeMap()
{
    // Primary Key
    this.HasKey(t => t.ID);

    // Properties
    // Table & Column Mappings
    this.ToTable("Edges");
    this.Property(t => t.ID).HasColumnName("ID");
    this.Property(t => t.StartStationId).HasColumnName("StartStationId");
    this.Property(t => t.EndStationId).HasColumnName("EndStationId");
    this.Property(t => t.Distance).HasColumnName("Distance");
    this.Property(t => t.Time).HasColumnName("Time");
    this.Property(t => t.IsActive).HasColumnName("IsActive");

    // Relationships
    //this.HasOptional(t => t.StartStation)
    //    .WithMany(t => t.Edges)
    //    .HasForeignKey(d => d.StarStationId);
    //this.HasOptional(t => t.EndStation)
    //    .WithMany(t => t.Edges)
    //    .HasForeignKey(d => d.EndStationId);
}
例外情况:

在模型生成过程中检测到一个或多个验证错误: System.Data.Entity.Edm.EdmAssociationType::多重性与关系“Edge\U EndStation”中角色“Edge\U EndStation\U Target”中的引用约束冲突。因为从属角色中的所有属性都不可为null,所以主体角色的多重性必须为“1”


我认为您发布的特定错误是抱怨
有可选的
。由于外键(
StartStationId
EndStationId
)不可为空,因此它需要一个所需的映射。尝试将其更改为
HasRequired
,或将
StartStationId
EndStationId
的类型更改为
int?
,以便它知道导航属性可以为空


至于
集合,它应该包含什么?使用
StartStationId
EndStationId
值引用
站点的任何
边缘
?如果是这样的话,我认为你不可能用一个集合就做到这一点。

我认为你发布的特定错误是抱怨
具有可选性。由于外键(
StartStationId
EndStationId
)不可为空,因此它需要一个所需的映射。尝试将其更改为
HasRequired
,或将
StartStationId
EndStationId
的类型更改为
int?
,以便它知道导航属性可以为空


至于
集合,它应该包含什么?使用
StartStationId
EndStationId
值引用
站点的任何
边缘
?如果是这样的话,我认为你不能用一个集合来实现这一点。

我认为EF在持久化对Edge集合的更改时可能会感到困惑,所以我认为EF不会让你这么做。我认为您可能最终会使用两个边集合或非虚拟边集合,您可以手动加载站点集合中的边。我认为EF在保留对边集合的更改时可能会感到困惑,因此我认为EF不会允许您这样做。我认为最终可能会使用两个边集合或非虚拟边集合,在其中手动从station集合加载边。边集合应包含StationId等于StartStationId的边。然而,正如你所说,这可能不是我想要的。我最终从Edge中删除了StartStation对象,只添加了对EndStation的引用。我认为这应该是可能的。如果您仍在使用它,请尝试类似于
this.hasportional(t=>t.StartStation).WithMany(t=>t.Edges).HasForeignKey(d=>d.StartStationId)
然后
this.HasOptional(t=>EndStation).WithMany().HasForeignKey(d=>d.EndStationId)
。边集合应包含StationId等于StartStationId的边。然而,正如你所说,这可能不是我想要的。我最终从Edge中删除了StartStation对象,只添加了对EndStation的引用。我认为这应该是可能的。如果您仍在使用它,请尝试类似于
this.hasportional(t=>t.StartStation).WithMany(t=>t.Edges).HasForeignKey(d=>d.StartStationId)this.has可选(t=>EndStation).WithMany().HasForeignKey(d=>d.EndStationId)
public partial class Edge
{
    public int ID { get; set; }
    public int StartStationId { get; set; }
    public virtual Station StartStation { get; set; }
    public int EndStationId { get; set; }
    public virtual Station EndStation { get; set; }
    public decimal Distance { get; set; }
    public decimal Time { get; set; }
    public bool IsActive { get; set; }
}
public EdgeMap()
{
    // Primary Key
    this.HasKey(t => t.ID);

    // Properties
    // Table & Column Mappings
    this.ToTable("Edges");
    this.Property(t => t.ID).HasColumnName("ID");
    this.Property(t => t.StartStationId).HasColumnName("StartStationId");
    this.Property(t => t.EndStationId).HasColumnName("EndStationId");
    this.Property(t => t.Distance).HasColumnName("Distance");
    this.Property(t => t.Time).HasColumnName("Time");
    this.Property(t => t.IsActive).HasColumnName("IsActive");

    // Relationships
    //this.HasOptional(t => t.StartStation)
    //    .WithMany(t => t.Edges)
    //    .HasForeignKey(d => d.StarStationId);
    //this.HasOptional(t => t.EndStation)
    //    .WithMany(t => t.Edges)
    //    .HasForeignKey(d => d.EndStationId);
}