Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/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
Code first 如何首先使用entity framework 5代码删除具有导航属性的对象?_Code First_Entity Framework 5_Delete Row - Fatal编程技术网

Code first 如何首先使用entity framework 5代码删除具有导航属性的对象?

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; }

我首先使用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 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命令在这两种类型的关联之间是不同的