2012-08-07 64 views
6

我在个人ASP.NET MVC 3项目上使用EF代码优先(4.3.1),具有非常简单的领域模型,而且我几乎处于EF将按照我希望的方式生成数据库模式。实体框架代码优先 - 虚拟财产列命名

域模型有两个类: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模式,唯一的小问题,我是,我还没有找到一种方法来控制列名它给出Gallery表中的CoverSlider的虚拟属性。

它会将它们命名为Cover_PaintingIdSlider_PaintingId

我试过使用[Column("columnNameHere")]属性,但这根本不影响它。正如“我输入了一个非相关的单词并且它没有出现在模式中”。

我想给它命名CoverPaintingId,没有下划线。

任何帮助,非常感谢。谢谢

回答

6

ForeignKey属性允许您定义,如果你想让它在模型中存在,这将作为你的外键行动的性质:

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

注意,你可以把属性无论是在对国外的虚拟财产键 - 只需要指定“另一个”的名称。

但是,因为您将在同一组实体之间有两个关系,所以如果不禁用其中一个或两个的级联删除,您将无法做到这一点。这只能使用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(...)之前配置这些。 WillCascadeOnDelete(false) API的一部分而不是使用ForeignKey。我喜欢使用外键,但如果你想这样做代码如下:

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'表'图库'可能会导致周期或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。 无法创建约束。查看以前的错误。 – GR7 2012-08-07 18:38:42

+0

啊,是的,忘了你会得到多重关系。更新了答案以解释如何解决这个问题。 – Richard 2012-08-07 18:48:42

+0

理查德。取得了一些进展,谢谢,但现在我收到以下错误:'ap.Models.Gallery'类型的属性'封面'上的ForeignKeyAttribute无效。在依赖类型“ap.Models.Painting”上未找到外键名'CoverPaintingId'。名称值应该是逗号分隔的外键属性名称列表。 从错误说,我明白我必须在绘画上创建一个CoverPaintingId属性?这不是我想要的,因为我只想将已经在Gallery上创建的列命名为“CoverPaintingId”而不是“Cover_PaintingId” – GR7 2012-08-07 18:56:10

0

你可以尝试使用[inverseproperty]装饰来实现这一点。

+0

Clot,我相信是当你有倒转的关系,并告诉EF不创建双FK关系。我实际上是使用它,但对于Gallery类中的Paintings属性。 InverseProperty不适用于我想要做的事情。我确实需要图库中的这些列,我只是想以不同的方式命名它们。 – GR7 2012-08-07 18:26:12