6

我在个人 ASP.NET MVC 3 项目上使用 EF Code First (4.3.1),具有非常简单的域模型,并且我几乎处于 EF 将以我想要的方式生成 DB 模式的地步.

域模型有两个类:PaintingGallery。每个都Painting属于一个Gallery,并且Gallery有两个虚拟属性指向Painting:一个指示哪幅画是它的封面图像,一个指示哪幅画是主页上显示的滑块图像。

课程如下。我删除了一些注释和不相关的属性以使其可读。

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

它为类及其关系生成正确的数据库模式,我唯一的小问题是我还没有找到一种方法来控制它赋予表Cover和表Slider中的虚拟属性的列名Gallery

它会将它们命名为Cover_PaintingIdSlider_PaintingId

我尝试使用该[Column("columnNameHere")]属性,但这根本不影响它。如“我输入了某个不相关的单词,但它没有出现在架构中”。

我想命名它CoverPaintingId,不带下划线。

任何帮助是极大的赞赏。谢谢

4

2 回答 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);
    }
}

如果您不希望代码模型中存在外键属性,也可以在.Map(...)之前使用.Map(...)配置这些属性。API 的WillCascadeOnDelete(false)部分,而不是使用 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);
    }
}
于 2012-08-07T18:27:47.200 回答
0

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

于 2012-08-07T17:44:08.530 回答