Отношение ко многим отношениям в скаффолдинге приводит к ошибке _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 с одним для множественности, после чего необходимо вручную установить флажок "добавить внешний ключ".

Другие вопросы по тегам