首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF核中的冲突合并

EF核中的冲突合并
EN

Stack Overflow用户
提问于 2019-07-20 00:02:26
回答 1查看 1.7K关注 0票数 1

我一直想在项目中改变我的模型和表格。我现在有一些模型:产品,ProductType,ProductComposition,ProductSize,ShoppingCart。产品有FK (ProductType,ProductTypeId),其他产品有FK到Product (ProductId,Product)

另外,我有一个带有Initialize方法的InitData.cs文件,我在表中添加了一些内容,所以我有一些工作要做。但问题是:

代码语言:javascript
复制
Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.Data.SqlClient.SqlException: 
The MERGE statement conflicted with the FOREIGN KEY constraint "FK_Products_ProductTypes_ProductTypeId". The conflict occurred in database "clothesstoredb", table "dbo.Products", column 'Id'.
The statement has been terminated.

我不清楚为什么会发生这种事,也许我对FK的模特做错了什么?我只是在学习,所以有点难以理解。此外,我的Guid生成方法也以某种方式崩溃了。我不知道问题出在哪里,但是cookie是空的,我不能添加GUID,甚至在我更改模型之前它也能工作。我觉得这很奇怪,因为我根本没有改变Startup.cs。

这是我的模特。

代码语言:javascript
复制
    {
        public int Id { get; set; }
        public string Image { get; set; }
        public string BrandName { get; set; }
        public string Name { get; set; }       
        public string Description { get; set; }
        public string Material { get; set; }
        public int Price { get; set; }       

        public int ProductTypeId { get; set; }
        public ProductType ProductType { get; set; }
    }
代码语言:javascript
复制
    public class ProductType
    {
        public int Id { get; set; }
        public string Description { get; set; }
    } 
代码语言:javascript
复制
public class ProductComposition
    {
        public int Id { get; set; }
        public int? Cotton { get; set; }
        public int? Denim { get; set; }
        public int? Leather { get; set; }
        public int? Polyester { get; set; }
        public int? Nylon { get; set; }
        public int? Elastane { get; set; }

        public int ProductId { get; set; }
        public Product Product { get; set; }
    }
代码语言:javascript
复制
public class ProductSize
    {
        public int Id { get; set; }

        public bool S { get; set; }
        public bool M { get; set; }
        public bool L { get; set; }
        public bool XL { get; set; }
        public bool XXL { get; set; }

        public int ProductId { get; set; }
        public Product Product { get; set; }

    }
代码语言:javascript
复制
public class ShoppingCart
    {
        public int Id { get; set; }
        public string Guid{ get; set; }
        public int Quantity { get; set; }
        public int ProductId { get; set; }
        public Product Product { get; set; }
    }

这是我的InitData.cs,这里出现了主要问题:

代码语言:javascript
复制
public static class InitData
    {
        public static void Initialize(ClothesContext context)
        {
            if (!context.Products.Any())
            {
                context.Products.AddRange(
                   new Product
                   {
                       Id = 1,
                       BrandName = "Vans",
                       Name = "Лонгслив OTW RAGLAN",
                       Image = "https://a.lmcdn.ru/img600x866/V/A/VA984EMCRY32_1833129_1_v2.jpg",
                       Description = "Хлопковый лонгслив от Vans решен в контрастной бело-черной цветовой гамме. " +
                       "Детали: прилегающий крой, рукав 3/4, округлый вырез горловины, стильный принт на фронтальной стороне.",
                       Material = "Хлопок - 100%",
                       Price = 2151,
                       ProductTypeId = 3

                   },
                   new Product
                   {
                       BrandName = "United Colors of Benetton",
                       Name = "Рубашка",
                       Price = 2510,
                       Description = "Рубашка United Colors of Benetton выполнена из тонкого, приятного на ощупь материала. Модель приталенного кроя. " +
                       "Детали: отложной воротник, планка и манжеты на пуговицах, слегка удлиненная спинка.",
                       Image = "https://a.lmcdn.ru/img600x866/U/N/UN012EMVWY79_5145481_1_v4.jpg",
                       Material = "Хлопок - 68%, Нейлон - 28%, Эластан - 4%",
                       ProductTypeId = 4

                   },
                   new Product
                   {
                       BrandName = "Jordan",
                       Name = "Толстовка M J JUMPMAN FLEECE FZ",
                       Price = 5690,
                       Description = "Толстовка от спорт-бренда выполнена из хлопкового трикотажа. Модель прямого кроя. " +
                       "Детали: регулируемый капюшон, два кармана, манжеты и низ на резинки, застежка на молнию.",
                       Image = "https://a.lmcdn.ru/img600x866/J/O/JO025EMFNEV0_9024380_1_v1_2x.jpg",
                       Material = "Хлопок - 80%, Полиэстер - 20%",
                       ProductTypeId = 2
                   },
                   new Product
                   {
                       BrandName = "Burton Menswear London",
                       Name = "Футболка",
                       Price = 1430,
                       Description = "Футболка из 100% хлопка.",
                       Image = "https://a.lmcdn.ru/img600x866/B/U/BU014EMFIHX0_8767196_1_v1.jpg",
                       Material = "Хлопок - 100%",
                       ProductTypeId = 1
                   }

                );


            }

            if (!context.ProductTypes.Any())
            {
                context.ProductTypes.AddRange(
                    new ProductType {                        
                        Description = "Футболки"
                    },
                    new ProductType
                    {                        
                        Description = "Худи"
                    },
                    new ProductType
                    {                        
                        Description = "Лонгсливы"
                    },
                    new ProductType
                    {

                        Description = "Рубашки"
                    }            
                    );

            }
            if (!context.ProductSizes.Any())
            {
                context.ProductSizes.AddRange(
                    new ProductSize
                    {
                        ProductId = 1,
                        XL = false,
                        L = true,
                        M = false,
                        S = false,
                        XXL = true
                    },
                    new ProductSize
                    {
                        ProductId = 2,
                        XL = true,
                        L = true,
                        M = true,
                        S = false,
                        XXL = true
                    },
                    new ProductSize
                    {
                        ProductId = 3,
                        XL = true,
                        L = false,
                        M = false,
                        S = false,
                        XXL = true
                    },
                    new ProductSize
                    {
                        ProductId = 4,
                        XL = false,
                        L = true,
                        M = false,
                        S = false,
                        XXL = true
                    }

                    );


            }
            if (!context.ProductCompositions.Any())
            {
                context.ProductCompositions.AddRange(
                    new ProductComposition
                    {
                        ProductId = 1,
                        Cotton = 100
                    },
                    new ProductComposition
                    {
                        ProductId = 2,
                        Cotton = 68,
                        Nylon = 28,
                        Elastane = 4
                    },
                    new ProductComposition
                    {
                        ProductId = 3,
                        Cotton = 80,
                        Polyester = 20
                    },
                    new ProductComposition
                    {
                        ProductId = 4,
                        Cotton = 100
                    }

                );


            }
            context.SaveChanges();

        }
    }

我期望DB结构,可以通过ProductTypeId设置衣服类型,在尺寸表中使用布尔值来设置大小,用int来组合?值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-22 07:20:10

您的MERGE语句试图插入在父表中没有相应记录的记录,因此出现错误。你得确保

首先,您需要为您的子实体(如ProductType表)添加种子,并使用context.SaveChanges()保存数据-- firstly.Then --您用现有的ProductTypeIdProduct实体添加种子,并记住使用context.SaveChanges()

此外,如果您希望手动为Key提供一个值,则需要在字段中添加以下属性:

代码语言:javascript
复制
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }

否则它会增加到1,2.

请参阅EF核心生成值

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57120750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档