2

次のコードは、すべてのコードがコメント化されていない場合に外部キーエラーを作成します。

public class Parent
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int FavoriteChildId { get; set; }
    public Child FavoriteChild { get; set; }
    //public int WorstChildId { get; set; }
    public Child WorstChild { get; set; }
    public ICollection<Child> Children { get; set; }
}

public class Child
{
    public int Id { get; set; }
    public string Name { get; set; }
    //public int ParentId { get; set; }
    public Parent Parent { get; set; }
}

public class CFContext : DbContext
{
    public DbSet<Parent> Parents { get; set; }
    public DbSet<Child> Children { get; set; }
}

外部キー名が指定されていない場合は機能しますが、モデルを編集する方法はありません。外部キー名を指定する方法を知っている人はいますか?

4

1 に答える 1

3

命名規則に従うと、上記の適切な FK が作成されます - あなたのコード:

public int WorstChildId { get; set; }
public Child WorstChild { get; set; }

WorstChild の WorstChildId の FK を作成します。ただし、上記のコードを試してみると、複数の削除パス エラーが発生しました (Parent -> WorstChild -> ChildTable、Parent -> FavoriteChild -> ChildTable)。

マッピングのいずれかまたは両方を削除時にカスケードしないように設定すると、問題が解決します。

public class CFContext : DbContext
{
    public DbSet<Parent> Parents { get; set; }
    public DbSet<Child> Children { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Child>()
            .HasRequired(c => c.Parent)
            .WithRequiredPrincipal(p => p.WorstChild)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Child>()
         .HasRequired(c => c.Parent)
         .WithRequiredPrincipal(p => p.FavoriteChild)
         .WillCascadeOnDelete(false);
    }
}
于 2012-08-21T13:03:41.930 に答える