实体框架:将FK放在Principle表中

时间:2017-10-12 18:43:01

标签: entity-framework

我使用以下代码为两个实体Entity2(原则)和modelBuilder.Entity<Entity1>() .HasRequired(x => x.Entity2) .WithRequiredPrincipal() .Map(x => x.MapKey("Entity1_Id")) .WillCascadeOnDelete(true); (依赖)配置级联删除

Entity2

这导致FK表示两个实体之间的关系在Entity1表中,是否可以更改此值以在Entity1表中生成FK,同时保留Entity2作为原则和<select class="form-control " id="InsuranceType" name="InsuranceType"> <option value="">All Types</option> <option value="Medical">Medical Insurance</option> <option value="Auto">Auto Insurance</option> <option value="Home">Home Insurance</option></select> 作为依赖?

1 个答案:

答案 0 :(得分:0)

对于一对一关系,PK通常在两个表中都是相同的名称。在主表中具有辅助ID形成多对一关系。对于1比0/1,您需要注意: 即

public class MyEntity
{
   public Guid EntityId { get; set; }
   // ...
}

public class RelatedEntity
{
  public Guid EntityId { get; set; }
  // ...
}

modelBuilder.Entity<MyEntity>()
                    .HasRequired(x => x.RelatedEntity)
                    .WithRequiredPrincipal() // 1-1 in EF, 1-0/1 in SQL Server
                    .Map(x => x.MapKey("EntityId"))
                    .WillCascadeOnDelete(true);

如果RelatedEntity有一个回复MyEntity的引用,那么你不应该使用MapKey:

modelBuilder.Entity<MyEntity>()
                    .HasRequired(x => x.RelatedEntity)
                    .WithRequiredPrincipal(x => x.MyEntity)
                    .WillCascadeOnDelete(true);

否则,您正在查看ManyToOne关系(如选择查找),该关系在主表中具有相关ID,但与父项无关:

public class MyEntity
{
  public Guid EntityId { get; set; }
  public virtual RelatedEntity RelatedEntity { get; set; }
}

modelBuilder.Entity<MyEntity>()
  .HasRequired(x => x.RelatedEntity)
  .WithMany()
  .WillCascadeOnDelete(true);

通过启用级联删除,这将允许它模仿1-1关系,但从结构上来说,它是多对1,这意味着没有任何架构方或EF可以阻止您将相同的相关实体分配给2不同的主要记录。如果这样做,当您尝试删除其中一个原色时,如果Cascade delete为True,则会出现错误。

编辑上面多对一场景中的级联选项不会从“父级”级联到“子级”,但在这种情况下它会从子级别级联到父级。如果您有一个Entity1的DbSet,但没有可用的Entity2的DbSet,那么您可以临时添加一个Entity2的DbSet来删除子级和关联的父级:

其中&#34; context&#34;是你的DbContext的实例

var entity2Set = context.Set<Entity2>();
entity2Set.Remove(entity1.Entity2);
context.SaveChanges();

当CascadeDelete为True时,这将删除Entity1和Entity2。

如上所述,它模仿1对1允许Entity1持有Entity2Id,但不建议这样做,因为在EF或SQL中没有什么能阻止您将相同的Entity2Id分配给多个Entity1记录。 (在这种情况下级联将删除多个Entity1记录)对于正确的1对1,在父实体和子实体上使用相同的ID。