6

非常に単純なドメイン モデルを使用して、個人的な ASP.NET MVC 3 プロジェクトで EF Code First (4.3.1) を使用しています。ほぼ、EF が希望どおりに DB スキーマを生成するところまで来ています。 .

ドメイン モデルには と の 2 つのクラスがPaintingありGalleryます。それぞれPaintingが単一の に属し、 にGalleryGalleryを指す 2 つの仮想プロパティがありますPainting。1 つはどの絵が表紙画像であるかを示し、もう 1 つはどの絵がホームページに表示される Slider 画像であるかを示します。

クラスは以下の通りです。読みやすくするために、いくつかの注釈と無関係なプロパティを削除しました。

public class Gallery
{
    public Gallery()
    {
        Paintings = new List<Painting>();
    }

    [ScaffoldColumn(false)]
    [Key]
    public int GalleryId { get; set; }

    public string Name { get; set; }

    [ScaffoldColumn(false)]
    [Column("LaCover")]
    public Painting Cover { get; set; }

    [ScaffoldColumn(false)]
    [Column("ElSlider")]
    public Painting Slider { get; set; }

    [ScaffoldColumn(false)]
    public virtual List<Painting> Paintings { get; set; }
}

と塗装:

public class Painting
{
    [ScaffoldColumn(false)]
    [Key]
    public int PaintingId { get; set; }

    public string Name { get; set; }

    public int GalleryId { get; set; }

    [Column("GalleryId")]
    [ForeignKey("GalleryId")]
    [InverseProperty("Paintings")]
    public virtual Gallery Gallery { get; set; }

    public string Filename { get; set; }
}

クラスとその関係の両方に対して正しい db スキーマを生成します。私が抱えている唯一の小さな問題は、テーブルの仮想プロパティCoverとテーブルSlider内の仮想プロパティに与える列名を制御する方法が見つからないことGalleryです。

と という名前が付けられCover_PaintingIdますSlider_PaintingId

属性を使用してみまし[Column("columnNameHere")]たが、まったく影響しません。「関係のない特定の単語を入力しましたが、スキーマに表示されませんでした」のように。

アンダースコアなしで名前を付けたいと思いCoverPaintingIdます。

どんな助けでも大歓迎です。ありがとう

4

2 に答える 2

6

ForeignKey属性を使用すると、モデル内に外部キーを存在させたい場合に外部キーとして機能するプロパティを定義できます。

[ForeignKey("CoverPaintingId")]
public virtual Painting Cover { get; set; }
public int? CoverPaintingId { get; set; }

外部キーの仮想プロパティに属性を設定できることに注意してください。「もう一方」の名前を指定するだけです。

ただし、同じエンティティのセット間に2つの関係があるため、一方または両方のカスケード削除を無効にしないと、これを行うことはできません。これは、 FluentConfigurationAPIを使用してのみ実行できます。

public class Gallery
{
    public int GalleryId { get; set; }

    [ForeignKey("CoverPaintingId")]
    public virtual Painting Cover { get; set; }
    public int? CoverPaintingId { get; set; }

    [ForeignKey("SliderPaintingId")]
    public virtual Painting Slider { get; set; }
    public int? SliderPaintingId { get; set; }

}

public class Painting
{
    public int PaintingId { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<Gallery> Galleries { get; set; }
    public DbSet<Painting> Paintins { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Gallery>().HasOptional(g => g.Cover).WithMany().WillCascadeOnDelete(false);
        modelBuilder.Entity<Gallery>().HasOptional(g => g.Slider).WithMany().WillCascadeOnDelete(false);
    }
}

コードモデルに外部キープロパティを存在させたくない場合は、。の前に.Map(...)を使用してこれらを構成することもできます。ForeignKeyを使用する代わりに、APIのWillCascadeOnDelete(false)部分。私は外部キーを使用することを好みますが、この方法で実行したい場合、コードは次のようになります。

public class Gallery
{
    public int GalleryId { get; set; }
    public virtual Painting Cover { get; set; }
    public virtual Painting Slider { get; set; }
}

public class Painting
{
    public int PaintingId { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<Gallery> Galleries { get; set; }
    public DbSet<Painting> Paintins { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Gallery>().HasOptional(g => g.Cover).WithMany().Map(m => m.MapKey("CoverPaintingId")).WillCascadeOnDelete(false);
        modelBuilder.Entity<Gallery>().HasOptional(g => g.Slider).WithMany().Map(m => m.MapKey("SliderPaintingId")).WillCascadeOnDelete(false);
    }
}
于 2012-08-07T18:27:47.200 に答える
0

[inverseproperty] 装飾を使用してこれを実現できます。

于 2012-08-07T17:44:08.530 に答える