实体框架Code First - 虚拟属性列命名

6
我正在一个个人ASP.NET MVC 3项目中使用EF Code First(4.3.1),该项目与IT技术有关。领域模型非常简单,我已经接近EF生成我想要的DB架构的点了。
领域模型有两个类:Painting和Gallery。每个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; }
}

它为类及其关系生成正确的数据库架构,但我遇到了一个小问题,即我没有找到一种方法来控制CoverSlider虚拟属性在Gallery表中所赋予的列名。
它将把它们命名为Cover_PaintingIdSlider_PaintingId
我尝试使用[Column("columnNameHere")]属性,但它根本没有影响它。就像“我输入了一个与此无关的单词,但它没有显示在模式中”。
我想把它命名为CoverPaintingId,没有下划线。
非常感谢任何帮助。谢谢。
2个回答

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

如果您不希望在代码模型中存在外键属性,您也可以在API的.Map(...)之前配置这些属性,而不是使用ForeignKey。我更喜欢使用ForeignKey,但如果您想以这种方式完成,代码将如下所示: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);
    }
}

啊,是的,我忘了你会遇到多个关系的情况。我更新了答案,解释了如何解决这个问题。 - Richard
Richard。谢谢你的帮助,我已经有了一些进展,但现在我遇到了以下错误:属性'Cover'上的ForeignKeyAttribute在类型'ap.Models.Gallery'上无效。从属类型'ap.Models.Painting'中未找到外键名称'CoverPaintingId'。Name值应该是逗号分隔的外键属性名称列表。根据错误信息,我理解我需要在Painting上创建一个CoverPaintingId属性?但这不是我想要的,因为我只想将已经在Gallery上创建的列命名为“CoverPaintingId”,而不是“Cover_PaintingId”。 - GR7
现在请再试一次。我经常会被 .WithMany() 和 .WithRequired() 选项搞混,而且我用错了一个。我已经把这段代码放进样例中,看起来没问题。 - Richard
你真棒,Richard!现在它起作用了。感谢你花时间帮助我! - GR7
我现在也添加了完全使用Fluent API的代码,只是为了完整性。根据需要,您可以将HasOptional替换为HasRequired - Richard
显示剩余2条评论

0
你可以尝试使用[inverseproperty]装饰器来实现这个功能。

Clot,我相信是用于当您拥有反向关系并告诉EF不要创建双重FK关系时使用的。实际上,我正在使用它,但是用于Gallery类中的Paintings属性。InverseProperty对于我想要做的事情不起作用。我确实需要在Gallery中使用这些列,只是想以不同的名称命名它们。 - GR7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接