我使用以下代码为两个实体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>
作为依赖?
答案 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。