多对多关系scaffolded视图生成错误_id1

时间:2013-04-07 02:19:02

标签: asp.net-mvc many-to-many

我正在处理的应用程序在创建模型实例时会生成错误。我有Product和Color(多对多)和ProductImage(ProductColor的许多ProductImage)。

public partial class ProductColor
{
    public ProductColor()
    {
        this.ProductImages = new HashSet<ProductImage>();
    }
    public int Id { get; set; }
    [DefaultValue(0),DisplayName("Price Offset")]
    public Decimal PriceOffset { get; set; }
    public int ProductId { get; set; }
    public int ColorId { get; set; }

    public virtual Color Color { get; set; }
    public virtual Product Product { get; set; }
    public virtual ICollection<ProductImage> ProductImages { get; set; }
}

public partial class ProductImage
{
    public int Id { get; set; }
    [DisplayName("File name"),
      Required(),
      StringLength(255)]
    public string FileName { get; set; }
    public bool Default { get; set; }
    public int ProductColor_Id { get; set; }

    public virtual ProductColor ProductColor { get; set; }
}

public class testContext : DbContext
{
    public testContext() : base("name=testContext")
    {
    }
    public DbSet<Product> Products { get; set; }
    public DbSet<Manufacturer> Manufacturers { get; set; }
    public DbSet<ProductColor> ProductColors { get; set; }
    public DbSet<Color> Colors { get; set; }
    public DbSet<ProductImage> ProductImages { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Product>()
            .HasMany(c => c.ProductColors);
    }    
}

对于ProductImage的控制器和视图的脚手架并转到ProductImage的索引后,我尝试从db上下文获取ProductImages时出错。 难怪因为Entity决定使用以下sql来获取实例:

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[FileName] AS [FileName], 
[Extent1].[Default] AS [Default], 
[Extent1].[ProductColor_Id] AS [ProductColor_Id], 
[Extent1].[ProductColor_Id1] AS [ProductColor_Id1]
FROM [dbo].[ProductImages] AS [Extent1]

数据库中不存在ProductColor_Id1。这是创建表的SQL:

CREATE TABLE [dbo].[ProductColors] (
    [Id] int IDENTITY(1,1) NOT NULL,
    [PriceOffset] decimal(7,2)  NOT NULL,
    [ProductId] int  NOT NULL,
    [ColorId] int  NOT NULL
);
CREATE TABLE [dbo].[ProductImages] (
    [Id] int IDENTITY(1,1) NOT NULL,
    [FileName] nvarchar(255)  NOT NULL,
    [Default] bit  NOT NULL,
    [ProductColor_Id] int  NOT NULL
);
ALTER TABLE [dbo].[ProductColors]
ADD CONSTRAINT [PK_ProductColors]
    PRIMARY KEY CLUSTERED ([Id] ASC);
ALTER TABLE [dbo].[ProductColors]
ADD CONSTRAINT [FK_ProductColorColor]
    FOREIGN KEY ([ColorId])
    REFERENCES [dbo].[Colors]
        ([Id])
    ON DELETE NO ACTION ON UPDATE NO ACTION;
CREATE INDEX [IX_FK_ProductColorColor]
ON [dbo].[ProductColors]
    ([ColorId]);
ALTER TABLE [dbo].[ProductColors]
ADD CONSTRAINT [FK_ProductColorProduct]
    FOREIGN KEY ([ProductId])
    REFERENCES [dbo].[Products]
        ([Id])
    ON DELETE NO ACTION ON UPDATE NO ACTION;
CREATE INDEX [IX_FK_ProductColorProduct]
ON [dbo].[ProductColors]
    ([ProductId]);
ALTER TABLE [dbo].[ProductImages]
ADD CONSTRAINT [FK_ProductColorProductImage]
    FOREIGN KEY ([ProductColor_Id])
    REFERENCES [dbo].[ProductColors]
        ([Id])
    ON DELETE NO ACTION ON UPDATE NO ACTION;
CREATE INDEX [IX_FK_ProductColorProductImage]
ON [dbo].[ProductImages]
    ([ProductColor_Id]);

数据库是从实体图生成的,对我来说很好看。我不知道为什么在ProductImage上创建它在select语句中添加了ProductColor_Id1。

希望提供足够的信息,这是一个容易解决的普遍错误。感谢您阅读本文,希望您能提供帮助。

我希望脚手架控制器和视图能够在列表,创建,编辑和删除ProdcutImage对象时工作,但因为它甚至无法使用提供给实体的信息创建一个。

1 个答案:

答案 0 :(得分:0)

在实体图中删除并重新创建关联后,我最终得到了一个具有ProductColorId而不是ProductColor_Id的ProductImage。

不太清楚我的做法有何不同(也许在图中检查了“向ProductImage实体添加外键属性”。

从图中重新创建数据库并从数据库重新创建模型类(在另一个项目中使用)。 ProductImage现在看起来像这样:

public partial class ProductImage
{
    public int Id { get; set; }
    [DisplayName("File name"),
      Required(),
      StringLength(255)]
    public string FileName { get; set; }
    public bool Default { get; set; }
    public int ProductColorId { get; set; }

    public virtual ProductColor ProductColor { get; set; }
}

据我所知,唯一的区别是ProductColerId,必须是Entity中的约定,以这种方式指定关系。

在图表中工作时的提示:

在一对多中首先单击一侧(在我的情况下,一个ProductColor有许多ProductImage,所以我右键单击ProductColor)。然后选择add new =&gt;关联它会自动将ProductColor(被点击的项目)设置为一个。现在在右侧设置多个关系将自动检查“添加外键”复选框。

如果我先点击多边(右键单击ProductImage)。然后将左侧下拉菜单更改为多个,右侧选择ProductColor,其中一个用于多重性,然后需要手动检查“添加外键”复选框。