Code first 如何首先使用entity framework 5代码删除具有导航属性的对象?
我首先使用EF 5代码,我有两个相关实体ApplicationPermission和Application:Code first 如何首先使用entity framework 5代码删除具有导航属性的对象?,code-first,entity-framework-5,delete-row,Code First,Entity Framework 5,Delete Row,我首先使用EF 5代码,我有两个相关实体ApplicationPermission和Application: public class ApplicationPermission { public virtual Application Application { get; set; } public int Id { get; set; } } public class Application { public string Name { get; set; }
public class ApplicationPermission
{
public virtual Application Application { get; set; }
public int Id { get; set; }
}
public class Application
{
public string Name { get; set; }
public int Id { get; set; }
}
HasKey(x => x.Id);
使用以下ApplicationPermission映射:
HasKey(x => x.Id);
HasRequired(x => x.Application).WithMany().Map(m => m.MapKey("ApplicationId")).WillCascadeOnDelete(false);
ApplicationPermission entity = new ApplicationPermission { Id = id };
DbContext.Set<ApplicationPermission>().Attach(entity);
DbContext.Set<ApplicationPermission>().Remove(entity);
DbContext.SaveChanges();
及申请:
public class ApplicationPermission
{
public virtual Application Application { get; set; }
public int Id { get; set; }
}
public class Application
{
public string Name { get; set; }
public int Id { get; set; }
}
HasKey(x => x.Id);
我使用以下代码删除ApplicationPermission:
HasKey(x => x.Id);
HasRequired(x => x.Application).WithMany().Map(m => m.MapKey("ApplicationId")).WillCascadeOnDelete(false);
ApplicationPermission entity = new ApplicationPermission { Id = id };
DbContext.Set<ApplicationPermission>().Attach(entity);
DbContext.Set<ApplicationPermission>().Remove(entity);
DbContext.SaveChanges();
ApplicationPermission entity=newapplicationpermission{Id=Id};
DbContext.Set().Attach(实体);
DbContext.Set().Remove(实体);
DbContext.SaveChanges();
但我在SaveChanges方法上出错:
“CodeFirstContainer.ApplicationPermissions”中的实体参与
“ApplicationPermission\u应用程序”关系。0相关
找到“应用程序权限\应用程序\目标”。1.
应为“应用程序权限\应用程序\目标”
如何在不将应用程序加载到dbcontext的情况下删除ApplicationPermission?我认为在使用独立关联时,如果未设置所需的导航属性,则无法删除实体。您必须从数据库加载
应用程序
,或者至少知道外键值,并使用该值附加应用程序
实体,如下所示:
ApplicationPermission entity=newapplicationpermission{Id=1};
entity.Application=newapplication{Id=5};
DbContext.Set().Attach(实体)//附加应用程序
DbContext.Set().Remove(实体);
DbContext.SaveChanges();
调用SaveChanges
时生成的SQL命令是:
exec sp_executesql N'delete[dbo].[ApplicationPermissions]
其中([Id]=@0)和([ApplicationId]=@1))',N'@0 int,@1 int',@0=1,@1=5
如您所见,delete
的查询不仅要求删除ApplicationPermission
的Id
,还要求删除ApplicationId
的(和
)外键值。为了成功,您必须通过使用相同的主键设置相关实体来了解并设置此FK值
使用外键关联时不会出现此问题:
公共类应用程序权限
{
公共虚拟应用程序应用程序{get;set;}
public int ApplicationId{get;set;}
公共int Id{get;set;}
}
映射:
modelBuilder.Entity()
.HasRequired(x=>x.Application)
.有很多
.HasForeignKey(x=>x.ApplicationId)
.WillCascadeOnDelete(假);
然后,您可以使用原始代码,而无需将FK属性ApplicationId
设置为正确的值(默认值为0
),也无需设置导航属性和删除实体即可。SQL命令不关心FK,只查询要删除的ApplicationPermission
的Id
:
exec sp_executesql N'delete[dbo].[ApplicationPermissions]
其中([Id]=@0'),N'@0 int',@0=1
我不知道为什么SQL命令在这两种类型的关联之间是不同的