实体框架6代码首先通过外键关系保存集合



嗨,我有问题保存一个集合到数据库,这是通过一个外键相关的

这是我的。

public class Product
{
    public int ProductId { get; set; }
    public string ProductName { get; set; }
    public ICollection<Image> Images { get; set; }
}
public class Image
{
    public int ImageId { get; set; }
    public string ImageName { get; set; }
}
public class TestDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }
    public DbSet<Image> Images { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }
}

我想保存图片和产品如下。

 using (TestDbContext s = new TestDbContext())
            {        
                Product p = new Product() { ProductName = "test", Images = new List<Image>() {new Image{ ImageName="test"} } };
                s.Products.Add(p);
                s.SaveChanges();
            }

但是,我得到以下错误:

{"Invalid column name 'Product_ProductId'."}

编辑

表结构

    CREATE TABLE [dbo].[Image](
        [ImageId] [int] IDENTITY(1,1) NOT NULL,
        [ImageName] [nvarchar](50) NULL,
     CONSTRAINT [PK_Image] PRIMARY KEY CLUSTERED 
    (
        [ImageId] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] 

CREATE TABLE [dbo].[Product](
    [ProductId] [int] IDENTITY(1,1) NOT NULL,
    [ProductName] [nvarchar](50) NULL,
    [ImageId] [int] NULL,
 CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED 
(
    [ProductId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Product]  WITH CHECK ADD FOREIGN KEY([ImageId])
REFERENCES [dbo].[Image] ([ImageId])
GO

我做错了什么?

如果您要使用现有的数据库,您需要从Product类中删除此属性

public ICollection<Image> Images { get; set; }

并在Image

上添加此属性
public ICollection<Product> Products { get; set; }

然后在OnModelCreating上添加以下配置。

modelBuilder.Entity<Image>().HasMany(i => i.Products).WithRequired().Map(m => m.MapKey("ImageId"));

,最后这样使用

var i = new Image() { ImageName = "test", Products = new List<Product> { new Product { ProductName = "test" } } };
s.Images.Add(i);
s.SaveChanges();

最新更新