我正在处理的应用程序在创建模型实例时会生成错误。我有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对象时工作,但因为它甚至无法使用提供给实体的信息创建一个。
答案 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,其中一个用于多重性,然后需要手动检查“添加外键”复选框。