Отношение ко многим отношениям в скаффолдинге приводит к ошибке _id1
Приложение, над которым я работаю, генерирует ошибку при создании экземпляра модели. У меня есть Product и Color (многие ко многим) и ProductImage (многие ProductImage к ProductColor).
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 я получаю ошибку, пытаясь получить 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 он добавил ProductColor_Id1 в операторе выбора.
Надеюсь, что информации предоставлено достаточно, и это общая ошибка, которую легко разрешить. Спасибо за чтение и надеюсь, что вы можете помочь.
Я хотел бы, чтобы scaffolded контроллер и представления работали в распечатке, создании, редактировании и удалении объектов ProdcutImage, но поскольку это даже невозможно создать с информацией, предоставленной Entity.
1 ответ
После удаления и повторного создания ассоциации на диаграмме сущностей я получил ProductImage с ProductColorId вместо ProductColor_Id.
Не слишком уверен, что я сделал по-другому (возможно, проверил "Добавить свойства внешнего ключа к сущности 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). Затем, при выборе добавления новой => ассоциации, он автоматически устанавливает ProductColor (выбранный элемент) в единицу. Теперь установка соотношения "много" на правой стороне автоматически установит флажок "добавить внешний ключ".
Если бы я сначала нажал на многие стороны (щелкните правой кнопкой мыши на ProductImage). Затем измените выпадающий список слева на многие, а справа выберите ProductColor с одним для множественности, после чего необходимо вручную установить флажок "добавить внешний ключ".