2012-08-07 4 views
6

아주 간단한 도메인 모델로 개인 ASP.NET MVC 3 프로젝트에서 EF Code First (4.3.1)를 사용하고 있으며 EF는 원하는대로 DB 스키마를 생성합니다.Entity Framework 코드 우선 - 가상 속성 열 이름 지정

도메인 모델에는 PaintingGallery의 두 클래스가 있습니다. 각 Painting은 하나의 Gallery에 속하며 Gallery에는 Painting을 가리키는 두 개의 가상 속성이 있습니다. 하나는 그림의 표지 이미지이고 다른 하나는 홈 페이지에 표시된 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의 가상 속성을 Gallery 테이블에 제공합니다.

이름은 Cover_PaintingIdSlider_PaintingId입니다.

[Column("columnNameHere")] 속성을 사용해 보았지만 전혀 영향을주지 않습니다. "특정 비 관련 단어를 입력했는데 스키마에 표시되지 않았습니다."와 마찬가지입니다.

밑줄없이 CoverPaintingId으로 지정하고 싶습니다.

도움을 주시면 대단히 감사하겠습니다. 감사합니다

답변

6

ForeignKey 속성은 당신은 당신이 당신의 모델 내에 존재 할 경우 외래 키 역할을 할 속성을 정의 할 수 있습니다 key - "다른 하나"의 이름을 지정하면됩니다. 그러나

, 당신은 개체의 동일한 세트 사이에 두 관계를 맺고 때문에, 당신은 캐스 케이 딩을 사용하지 않고이 작업을 수행 할 수 없습니다 하나 또는 둘 다에 삭제합니다. 이는 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를 사용하는 대신 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); 
    } 
} 
+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'유형의 'Cover'속성에 대한 ForeignKeyAttribute가 유효하지 않습니다. 종속 키 유형 'ap.Models.Painting'에서 외래 키 이름 'CoverPaintingId'를 찾을 수 없습니다. Name 값은 쉼표로 구분 된 외래 키 특성 이름 목록이어야합니다. 오류 메시지에서 Painting에 CoverPaintingId 속성을 만들어야한다는 것을 이해합니다. Gallery에서 이미 작성중인 열의 이름을 "Cover_PaintingId"대신 "CoverPaintingId"로만 지정하고 싶기 때문에 원하는 것은 아닙니다. – GR7

0

이것을 달성하기 위해 [inverseproperty] 장식을 사용해 볼 수 있습니다. 당신이 외국의 가상 재산 중 속성을 넣을 수 있습니다

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

참고 :

+0

Clot, 나는 관계가 거꾸로되어 있고 이중 FK 관계를 만들지 말라고 EF에게 말합니다. . 실제로 갤러리 클래스의 Paintings 속성에 사용하고 있습니다. InverseProperty는 내가하고 싶은 일을하지 않을 것입니다.갤러리에서 해당 열이 필요합니다. 다른 이름으로 지정하고 싶습니다. – GR7

관련 문제