Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架代码优先-虚拟属性列命名_C#_.net_Entity Framework 4 - Fatal编程技术网

C# 实体框架代码优先-虚拟属性列命名

C# 实体框架代码优先-虚拟属性列命名,c#,.net,entity-framework-4,C#,.net,Entity Framework 4,我在一个个人ASP.NET MVC 3项目中首先使用EF代码(4.3.1),使用一个非常简单的域模型,我几乎到了EF将以我希望的方式生成DB模式的地步 域模型有两个类:Painting和Gallery。每个绘画都属于一个图库,而图库有两个虚拟属性指向绘画:一个用于指示哪幅绘画是其封面图像,另一个用于指示哪幅绘画是主页上显示的滑块图像 课程如下。我删除了一些注释和不相关的属性以使其可读 public class Gallery { public Gallery() {

我在一个个人ASP.NET MVC 3项目中首先使用EF代码(4.3.1),使用一个非常简单的域模型,我几乎到了EF将以我希望的方式生成DB模式的地步

域模型有两个类:
Painting
Gallery
。每个
绘画
都属于一个
图库
,而
图库
有两个虚拟属性指向
绘画
:一个用于指示哪幅绘画是其封面图像,另一个用于指示哪幅绘画是主页上显示的滑块图像

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

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; }
}
它为这两个类及其关系生成了正确的db模式,唯一的小问题是,我没有找到一种方法来控制它为
表中的
封面
滑块
的虚拟属性提供的列名

它将它们命名为
Cover\u PaintingId
Slider\u PaintingId

我尝试使用
[Column(“columnNameHere”)]
属性,但这一点都不影响它。就像“我输入了一个不相关的单词,但它没有出现在模式中”

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


非常感谢您的帮助。感谢您,您可以尝试使用[inverseproperty]装饰来实现这一点。

如果您希望属性存在于模型中,则该属性允许您定义用作外键的属性:

[ForeignKey("CoverPaintingId")]
public virtual Painting Cover { get; set; }
public int? CoverPaintingId { get; set; }
注意,您可以将属性放在外键的虚拟属性上,只需指定“另一个”的名称即可

但是,由于同一组实体之间有两个关系,如果不禁用其中一个或两个实体上的级联删除,则无法执行此操作。这只能使用

公共类库
{
public int GalleryId{get;set;}
[ForeignKey(“CoverPaintingId”)]
公共虚拟绘画封面{get;set;}
公共int?CoverPaintingId{get;set;}
[ForeignKey(“SliderPaint ID”)]
公共虚拟绘制滑块{get;set;}
public int?SliderPaintingId{get;set;}
}
公共级绘画
{
公共int PaintingId{get;set;}
}
公共类MyContext:DbContext
{
公共数据库集库{get;set;}
公共DbSet Paintins{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity();
modelBuilder.Entity().has可选(g=>g.Slider).WithMany().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);
    }
}
公共类库
{
public int GalleryId{get;set;}
公共虚拟绘画封面{get;set;}
公共虚拟绘制滑块{get;set;}
}
公共级绘画
{
公共int PaintingId{get;set;}
}
公共类MyContext:DbContext
{
公共数据库集库{get;set;}
公共DbSet Paintins{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().has可选(g=>g.Cover).WithMany().Map(m=>m.MapKey(“CoverPaintingId”).WillCascadeOnDelete(false);
modelBuilder.Entity().has可选(g=>g.Slider)。WithMany().Map(m=>m.MapKey(“SliderPaintingId”)。将级联删除(false);
}
}

Clot,我相信是用于当你有反向关系时,告诉EF不要创建双重FK关系。我实际上是在使用它,但用于画廊类中的绘画属性。逆属性对我想做的事情不起作用。我确实需要Gallery中的那些列,我只是想用不同的名称命名它们。我也尝试过这样做,但我收到了以下错误:在表“Galleries”上引入外键约束“FK_Galleries\u Painties\u CoverPaintingId”可能会导致循环或多个级联路径。指定“在删除时不执行操作”或“在更新时不执行操作”,或修改其他外键约束。无法创建约束。看前面的错误。啊,是的,忘了你会得到多个关系。更新了答案,解释了如何解决这个问题。Richard。已取得一些进展,谢谢,但现在我遇到以下错误:“ap.Models.Gallery”类型的属性“Cover”上的ForeignKeyAttribute无效。在依赖类型“ap.Models.Painting”上未找到外键名称“CoverPaintingId”。名称值应为以逗号分隔的外键属性名称列表。从错误中可以看出,我知道我必须在绘画上创建CoverPaintingId属性?这不是我想要的,因为我只想将已经在Gallery上创建的列命名为“CoverPaintingId”,而不是“CoverPaintingId”,请立即重试。我经常被.WithMany()和.WithRequired()选项弄糊涂,我用错了。我已经把这段代码放进了一个示例中,我觉得它是对的。你就是理查德,它现在起作用了。谢谢你花时间帮忙!
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);
    }
}
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);
    }
}