【问题标题】:Entity Framework Code First - Virtual Property Column Naming实体框架代码优先 - 虚拟属性列命名
【发布时间】:2012-08-04 18:35:24
【问题描述】:

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

领域模型有两个类:PaintingGallery。每个Painting 都属于一个GalleryGallery 有两个指向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; }
}

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

它会将它们命名为 Cover_PaintingIdSlider_PaintingId

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

我想将其命名为CoverPaintingId,不带下划线。

非常感谢任何帮助。谢谢

【问题讨论】:

    标签: c# .net entity-framework-4


    【解决方案1】:

    您可以尝试使用 [inverseproperty] 装饰来实现此目的。

    【讨论】:

    • Clot,我相信是为了当你有倒置关系并告诉 EF 不要创建双重 FK 关系时。我实际上正在使用它,但是对于 Gallery 类中的 Paintings 属性。 InverseProperty 不适用于我想做的事情。我确实需要画廊中的那些列,我只是想用不同的方式命名它们。
    【解决方案2】:

    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 的 .WillCascadeOnDelete(false) 部分之前使用 .Map(...) 来配置这些属性,而不是使用 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);
        }
    }
    

    【讨论】:

    • 我也试过 Richard,但我收到以下错误:在表 'Galleries' 上引入 FOREIGN KEY 约束 'FK_Galleries_Paintings_CoverPaintingId' 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。无法创建约束。查看以前的错误。
    • 啊,是的,忘了你会得到多重关系。更新了答案以解释如何解决这个问题。
    • 理查德。取得了一些进展,谢谢,但现在我收到以下错误:类型“ap.Models.Gallery”的属性“Cover”上的 ForeignKeyAttribute 无效。在依赖类型“ap.Models.Painting”上找不到外键名称“CoverPaintingId”。 Name 值应该是逗号分隔的外键属性名称列表。从错误的内容来看,我知道我必须在绘画上创建一个 CoverPaintingId 属性?这不是我想要的,因为我只想将已在 Gallery 上创建的列命名为“CoverPaintingId”而不是“Cover_PaintingId”
    • 现在再试一次。我经常对 .WithMany() 和 .WithRequired() 选项感到困惑,而且我使用了错误的选项。我已将此代码放入示例中,它看起来对我来说是正确的。
    • 你就是理查德,它现在起作用了。感谢您抽出宝贵时间提供帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多