7

最初にEF5コードを使用しており、2つの関連エンティティ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; }
}

ApplicationPermissionの次のマッピングを使用します。

HasKey(x => x.Id);
HasRequired(x => x.Application).WithMany().Map(m => m.MapKey("ApplicationId")).WillCascadeOnDelete(false);

およびアプリケーションの場合:

HasKey(x => x.Id);

ApplicationPermissionを削除するには、以下のコードを使用します。

ApplicationPermission entity = new ApplicationPermission { Id = id };
DbContext.Set<ApplicationPermission>().Attach(entity);
DbContext.Set<ApplicationPermission>().Remove(entity);
DbContext.SaveChanges();

しかし、SaveChangesメソッドでエラーが発生しました:

'CodeFirstContainer.ApplicationPermissions'のエンティティは、'ApplicationPermission_Application'関係に参加します。0個の関連する「ApplicationPermission_Application_Target」が見つかりました。1'ApplicationPermission_Application_Target'が必要です。

アプリケーションをdbcontextにロードせずにApplicationPermissionを削除するにはどうすればよいですか?

4

1 に答える 1

3

独立した関連付けを使用する場合、必要なナビゲーションプロパティを設定せずにエンティティを削除することはできないと思います。データベースからをロードするApplicationか、少なくとも、外部キー値を知ってApplication、次のようにその値を持つエンティティをアタッチする必要があります。

ApplicationPermission entity = new ApplicationPermission { Id = 1 };
entity.Application = new Application { Id = 5 };
DbContext.Set<ApplicationPermission>().Attach(entity); //attaches Application too
DbContext.Set<ApplicationPermission>().Remove(entity);
DbContext.SaveChanges();

呼び出し時に生成されるSQLコマンドSaveChangesは次のとおりです。

exec sp_executesql N'delete [dbo].[ApplicationPermissions]
where (([Id] = @0) and ([ApplicationId] = @1))',N'@0 int,@1 int',@0=1,@1=5

ご覧のとおり、のクエリは、の削除をdelete要求するだけでなく、( )の外部キー値も要求します。成功するには、関連するエンティティに同じ主キーを設定して、このFK値を把握して設定する必要があります。IdApplicationPermissionandApplicationId

外部キーの関連付けを使用する場合、問題は発生しません。

public class ApplicationPermission
{
    public virtual Application Application { get; set; }
    public int ApplicationId { get; set; }

    public int Id { get; set; }
}

マッピング:

modelBuilder.Entity<ApplicationPermission>()
    .HasRequired(x => x.Application)
    .WithMany()
    .HasForeignKey(x => x.ApplicationId)
    .WillCascadeOnDelete(false);

その後、FKプロパティApplicationIdを正しい値に設定せずに(デフォルトでは0thenに設定されます)、ナビゲーションプロパティを設定せずに元のコードを使用でき、エンティティを削除できます。SQLコマンドはFKを気にせず、削除するIdのをクエリするだけです。ApplicationPermission

exec sp_executesql N'delete [dbo].[ApplicationPermissions]
where ([Id] = @0)',N'@0 int',@0=1

2つのタイプの関連付けでSQLコマンドが異なる理由がわかりません。

于 2012-10-15T19:31:02.820 に答える