次のSQLテーブルがあります(簡単にするために列を削除しました)。
create table dbo.Packs
(
Id int identity not null
constraint Packs_Id_PK primary key clustered (Id)
);
create table dbo.Files
(
Id int identity not null
constraint Files_Id_PK primary key clustered (Id),
PackId int not null
);
alter table dbo.Files
add constraint Files_PackId_FK foreign key (PackId) references dbo.Packs(Id) on delete cascade on update cascade;
次に、次のようにPocosを作成しました。
public class Pack {
public Int32 Id { get; set; }
public virtual ICollection<File> Files { get; set; }
} // Pack
public class File {
public Int32 Id { get; set; }
public int PackId { get; set; }
public virtual Pack Pack { get; set; }
} // File
そして、構成は次のとおりです。
internal class PackMapper : EntityTypeConfiguration<Pack> {
internal PackMapper()
: base() {
ToTable("Packs");
HasKey(x => x.Id);
Property(x => x.Id).IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}
} // PackMapper
internal class FileMapper : EntityTypeConfiguration<File> {
internal FileMapper()
: base() {
ToTable("Files");
HasKey(x => x.Id);
Property(x => x.Id).IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
// 1 > CONFIGURATION WITH FK IN ENTITY
Property(x => x.PackId).HasColumnName("PackId").IsRequired();
HasRequired(x => x.Pack).WithMany(x => x.Files).HasForeignKey(x => x.PackId);
// 2 > CONFIGURATION WITHOUT FK IN ENTITY
// HasRequired<Pack>(x => x.Pack).WithMany(y => y.Files).Map(z => { z.MapKey("PackId"); });
}
} // FileMapper
それから私はファイルを削除しようとしました:
Pack pack = context.Packs.First(x => x.Id == 31);
IList<Int32> ids = context.Entry<Pack>(pack).Collection(x => x.Files).Query().Select(x => x.Id).ToList();
foreach (int id in ids) {
File file = new File() { Id = id };
context.Files.Attach(file);
context.Files.Remove(file);
}
context.SaveChanges();
構成1を使用すると、ファイルが削除されます。
(FKプロパティを必要とせずに)構成2を使用すると、次のエラーが発生します。
'Context.Files'のエンティティは、'File_Pack'関係に参加します。0個の関連する「File_Pack_Target」が見つかりました。1'File_Pack_Target'が必要です。
何故ですか?FKプロパティを定義しない場合、他に何かを指定する必要がありますか?
注:私はEF5を使用しています。