C# 实体框架多对象关系
我有一个表,其中有两个外键指向同一父表Edge.StartStationId和Edge.EndStationId 我试图在实体框架中将SE映射到对象,但找不到解决问题的方法。 我发现了一些解决方案,在父站点(Station)上使用了2个集合,我对此不感兴趣 车站(家长)等级: 边贴图类,在OnModelCreating中添加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
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);
}