エンティティ フレームワークで外部キー関係を定義するのに問題があります。問題を示すために、コードを最小限にまとめました。
モデルは次のように定義されます。
public class AccessControlList
{
[Key] public int Id { get; set; }
public string Name { get; set; }
}
public class ManagedFile
{
[Key] public int Id { get; set; }
public string Name { get; set; }
public virtual AccessControlList AccessControl { get; set; }
}
public class ManagedFolder
{
[Key] public int Id { get; set; }
public string Name { get; set; }
public virtual AccessControlList AccessControl { get; set; }
public virtual ISet<ManagedFile> Files { get; private set; }
public ManagedFolder()
{
Files = new HashSet<ManagedFile>();
}
}
したがって、基本的には、ManagedFile または ManagedFolder エンティティのいずれかによって参照できる単一の AccessControl エンティティがあります。
外部キーが ManagedFile と ManagedFolder に追加されていることを確認するために、次の流暢なマッピングを追加しました。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<ManagedFile>()
.HasRequired(mf => mf.AccessControl)
.WithRequiredDependent()
.Map(m => m.MapKey("AccessControlListId"));
modelBuilder.Entity<ManagedFolder>()
.HasRequired(mf => mf.AccessControl)
.WithRequiredDependent()
.Map(m => m.MapKey("AccessControlListId"));
base.OnModelCreating(modelBuilder);
}
これにより、ManagedFile と ManagedFolder のそれぞれに外部キー AccessControlListId を使用して、期待どおりのデータベースが構築されます。
私にはすべて問題ないように見えますが、データを挿入しようとすると、このコードで
using(var ctx = new MyContext())
{
var mf = ctx.Folders.Add(new ManagedFolder {Name = "$/"});
mf.AccessControl = new AccessControlList();
var file = new ManagedFile {Name = "myfile.txt"};
mf.Files.Add(file);
file.AccessControl = new AccessControlList();
ctx.SaveChanges();
}
それはエラーをスローします...
自分が何をしたのか理解できませんが、それは間違っていますか?
マッピングを理解しているので、EF は新しい AccessControlList エンティティを保存し、Id を使用して ManagedFolder または ManagedFile テーブルを書き込むことができます。
いつものように、提供されたヘルプに感謝します。
ありがとうアンディ