2012-08-07 19 views
6

非常に単純なドメインモデルを使用して、私は個人的なASP.NET MVC 3プロジェクトでEF Code First(4.3.1)を使用しています。 EFは私が望むようにDBスキーマを生成します。Entity Frameworkコードファースト - 仮想プロパティ列のネーミング

ドメインモデルには、PaintingGalleryの2つのクラスがあります。各PaintingGalleryに属し、GalleryにはPaintingという2つの仮想プロパティがあります.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スキーマを生成し、私が持っている唯一の小さな問題は、私が列名を制御する方法を発見していないということですテーブル内のCoverSliderの仮想プロパティを示します。

Cover_PaintingIdSlider_PaintingIdとなります。

私は[Column("columnNameHere")]属性を使用しようとしましたが、それはまったく影響しません。 "私は特定の非関連単語を入力したが、スキーマには表示されませんでした"のように。

アンダースコアなしでCoverPaintingIdとしたいと思います。

ご協力いただきまして誠にありがとうございます。ありがとう

答えて

6

ForeignKey属性は、あなたはそれがあなたのモデル内に存在する場合、あなたの外部キーとして機能するプロパティを定義することができますキー - 「他のもの」の名前を指定するだけです。

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

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を使用する代わりに、WillCascadeOnDelete(false)のAPIの一部。私は、外部キーを使用することを好むが、ここであなたは、このようにそれをやってみたかった場合、コードがどのように見えるかです:

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); 
    } 
} 
+0

私はあまりにもリチャードをしようとしたが、私は次のエラーを受信:テーブル「ギャラリー」に関する 紹介FOREIGN KEY制約「FK_Galleries_Paintings_CoverPaintingId」サイクルまたは複数のカスケードパスを引き起こす可能性があります。 NO DELETE NO ACTIONまたはUP UP NO NO ACTIONを指定するか、他のFOREIGN KEY制約を変更してください。 制約を作成できませんでした。以前のエラーを参照してください。 – GR7

+0

ああ、複数の関係でそれを得るのを忘れてしまった。それを回避する方法を説明する答えを更新しました。 – Richard

+0

Richard。いくつかの進捗状況をありがとう、しかし、今私は、次のエラーが発生しています: 'ap.Models.Gallery'タイプのプロパティ 'カバー'のForeignKeyAttributeが有効ではありません。依存型 'ap.Models.Painting'に外部キー名 'CoverPaintingId'が見つかりませんでした。 Name値は、外部キーのプロパティ名をコンマで区切ったリストでなければなりません。 エラーが、私は絵画のCoverPaintingIdプロパティを作成する必要があると思います理解して言っているから?私はすでに今もう一度試してみてください – GR7

0

これを達成するために[inverseproperty]装飾を使用することができます。あなたが外国の仮想財産上のいずれかの属性を置くことができる

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

注:

+0

クロット、私はあなたが関係を反転しており、二重のFKの関係を作成していないEFを伝えるためにするときのためであると考えています。私は実際にそれを使用していますが、GalleryクラスのPaintingsプロパティで使用しています。 InversePropertyは、私がしたいことに対して機能しません。私はギャラリーでそれらの列が必要です、私はちょうど彼らの名前を別にしたい。 – GR7

関連する問題