- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么我的初始 update-database
失败了,我需要在我的数据库表类中更改什么才能使其正常工作?
当然,我可以将迁移脚本中的onDelete: ReferentialAction.Cascade
更改为onDelete: ReferentialAction.NoAction
,但这样我的应用程序就会面临其他问题。我正在寻求一种无需编辑 add-migration
生成的迁移脚本的解决方案。换句话说,我愿意更改我的数据库架构。
我想要的行为是当我删除一个 Product
时,关联的 ProductPropertyOptionForProducts
也被删除,但不是相反,而不是 ProductPropertyOption
与 ProductPropertyOptionForProducts
关联。
这是迁移输出错误信息:
Introducing FOREIGN KEY constraint 'FK_PropertyOptionsForProducts_ProductPropertyOptions_ProductPropertyOptionId' on table 'PropertyOptionsForProducts' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint or index. See previous errors.
导致错误的生成的SQL命令:
CREATE TABLE[PropertyOptionsForProducts] (
[Id] int NOT NULL IDENTITY,
[CustomNumberValue] decimal (18, 2) NOT NULL,
[CustomRangeFrom] decimal (18, 2) NOT NULL,
[CustomRangeTo] decimal (18, 2) NOT NULL,
[CustomStringValue] nvarchar(max) NULL,
[ProductId] int NOT NULL,
[ProductPropertyId] int NOT NULL,
[ProductPropertyOptionId] int NOT NULL,
CONSTRAINT[PK_PropertyOptionsForProducts] PRIMARY KEY([Id]),
CONSTRAINT[FK_PropertyOptionsForProducts_Products_ProductId]
FOREIGN KEY([ProductId])
REFERENCES[Products] ([Id]) ON DELETE CASCADE,
CONSTRAINT[FK_PropertyOptionsForProducts_ProductPropertyOptions_ProductPropertyOptionId]
FOREIGN KEY([ProductPropertyOptionId])
REFERENCES[ProductPropertyOptions] ([Id]) ON DELETE CASCADE
);
类:
public class ProductPropertyOption
{
public int Id { get; set; }
public int ProductPropertyId { get; set; }
// some more properties
public ProductProperty Property { get; set; }
public ICollection<PropertyOptionForProduct> PropertyOptionForProducts { get; set; }
}
public class PropertyOptionForProduct
{
public int Id { get; set; }
public int ProductId { get; set; }
public int ProductPropertyId { get; set; }
public int ProductPropertyOptionId { get; set; }
// some more properties
public Product Product { get; set; }
public ProductPropertyOption ProductPropertyOption { get; set; }
}
public class Product
{
public int Id { get; set; }
public bool Published { get; set; }
public int ProductGroupId { get; set; }
public int ProductGroupSortOrder { get; set; }
// some more properties
public int ProductTypeId { get; set; }
public ICollection<ProductImage> Images { get; set; }
public ICollection<PropertyOptionForProduct> ProductPropertyOptionForProducts { get; set; }
public ICollection<IdentifierForProduct> IdentifierForProducts { get; set; }
public ProductType Type { get; set; }
public ICollection<FrontPageProduct> InFrontPages { get; set; }
public ICollection<ProductInCategory> InCategories { get; set; }
}
public class ProductType
{
public int Id { get; set; }
public string Title { get; set; }
public List<ProductIdentifierInType> Identifiers { get; set; }
public List<ProductProperty> Properties { get; set; }
public ICollection<Product> Products { get; set; }
}
public class ProductProperty
{
public int Id { get; set; }
public int ProductTypeId { get; set; }
// some more properties
public List<ProductPropertyOption> Options { get; set; }
public ProductType ProductType { get; set; }
}
说明的数据库(产品和类别部分):
最佳答案
关系图清楚地显示了从 ProductType
到 PropertyOptionForProduct
的多重级联路径:
(1) ProductType
-> Product
-> PropertyOptionForProduct
(2) ProductType
-> ProductProperty
-> ProductPropertyOption
-> PropertyOptionForProduct
唯一的解决方案是通过关闭至少一个关系的级联删除来打破级联路径,然后手动处理主体实体删除。
可能最简单的方法是破坏一些根路径,例如 ProductType
-> ProductProperty
:
modelBuilder.Entity<ProductType>()
.HasMany(e => e.Properties)
.WithOne(e => e.ProductType)
.OnDelete(DeleteBehavior.Restrict);
然后当您需要删除 ProductType
而不是“正常”时:
db.Remove(db.Set<ProductType>().Single(e => e.Id == id));
db.SaveChanges();
你必须先删除相关的Properties
:
var productType = db.Set<ProductType>().Include(e => e.Properties).Single(e => e.Id == id);
db.RemoveRange(productType.Properties);
db.Remove(productType);
db.SaveChanges();
关于c# - FK 约束可能会导致循环或多个级联路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51281497/
假设我有两张 table ,a和 b : a { pk as int fk as int ... } b { pk as int ... } 我想在查询中加入 a 和 b,如下所示: FRO
我在 MYSQL 数据库的各个表中分配的列数比实际需要的长度要长。所以现在我尝试使它们具有适当的长度。它们是 VARCHAR(64),我想让它们变成 CHAR(36)。这些列涉及外键。这些更改将成为一
这是我的 table : 成员:ID,... 产品:ID,... 我的 Member 表有一些值,如果 Id = 0,则没有,并且我不想添加任何 Id = 0 的成员,所以我尝试运行此脚本: ALTE
这个问题已经有答案了: MySQL Relationships (1 个回答) 已关闭 4 年前。 这个问题可能在其他帖子中得到了回答,但我一直在搜索,但没有找到类似的东西(很有趣): 我使用 Lar
两个表,使用这些脚本创建: create table user_auth ( username varchar(255) NOT NULL, password varchar(255)
如果我添加带有 ON DELETE CASCADE 之类的 FK,我以后会遭受后果吗? 如果不是,我应该为 CakePHP 的 MySQL 中的 FK 使用什么命名约定? 最佳答案 您可以看到布局的命
我有一个类似的问题: How to create foreign key that is also a primary key in MySQL? 但是我的架构似乎与答案匹配,但仍然返回错误“ERRO
我有 2 个实体:PurchaseRequest (PR) 和 PurchasingRequestLineItem (PRLI)。他们遵循典型的关系模式,即 PR 有许多 PRLI。我在 PRLI 上
在尝试通过删除连接(非规范化)来优化物理数据模型时,我选择采用用户可能为 CommEventPurposeType 指定的所有可能值,将它们实现为 中的 BOOLEAN 属性>CommEventPur
我猜这些问题似乎很令人困惑。 库存实体 @Entity @IdClass(InventoryPK.class) public class Inventory { @Id @ManyTo
UNIQUE(col1, col2) 与 FK(col1), FK(col2) 我目前启用了两个索引,并且我不太关心外部关系本身。所以我想知道通过拥有所有这些键,我是否会获得冗余索引以提高读取性能,或
我需要将名为“practice”的列插入到表“cred_insurances”中,该表是一个 FK 引用表“practices” PK “id” 最佳答案 您需要通过在 mysql 提示符下运行以下命
使用 JPA 注释和 hibernate ,我们最近遇到了一个单向单多映射问题,如下所示: @Entity public class FooOrder extends AbstractEntity{
我经常听说在编写测试时不要使用随机数据,这对于大多数数据来说似乎是合理的。 但是,我认为我有可能需要这样做的情况。我正在处理的代码有一些非 AR 模型。例如,用户模型不受数据库表支持,因为我们通过 A
我的情况(简化)如下所示: 表 UNITS 在 UNITS.NAME 上有一个 PK。 (单位名称, varchar(12)) 表 DEPTS 在 DEPTS.NAME 上有一个 PK。 (部门名称,
我已经使用现有数据库的代码优先方法创建了一个 MVC 应用程序。 我注意到我的一个表不需要外键,所以我尝试删除它但我不断收到: The object 'FK_BorrowedProperty_code
为什么我的初始 update-database 失败了,我需要在我的数据库表类中更改什么才能使其正常工作? 当然,我可以将迁移脚本中的onDelete: ReferentialAction.Casca
我的主要目标是获取所有数据的最后更新时间。 详细信息:我有一张 table - 群组 groupId groupName timeUpdated (timestamp - on update) 还有另
作为练习,我正在构建我的第一个 SQL 数据库。我试图为数据库中的所有表创建语句。我想知道是否可以删除任何外键? 我的第二个问题是如何对使用 4 个或更多表的联接的数据库进行查询。 任何答案都将受到赞
我正在尝试在我的 H2 数据库中运行此 mysql 命令。 DB设置为mysql模式。 -- -----------------------------------------------------
我是一名优秀的程序员,十分优秀!