【发布时间】:2014-04-01 03:10:15
【问题描述】:
我已经阅读了关于 stackoverflow 上的 EF 外键问题的许多问题及其建议的解决方案。但没有一个适合我的情况。
我有一个父类 XSection
public class XSection
{
public int ObjectId {get; set;}
public OverBank LeftOverBank {get; set;}
public OverBank RightOverBank {get; set;}
}
overbanks 是父 Xsection 类的子实体(只有一个不在列表中)。 OverBanks 类看起来像
public class OverBank
{
public int ObjectId {get; set;}
public int ParentId (get; set;}
public double Station {get; set;}
// some other basic properties
}
为上述类生成的 DDL 是:
横截面表:
CREATE TABLE CrossSection (
ObjectID INTEGER NOT NULL,
LeftOverbank_ObjectID INTEGER NULL,
RightOverbank_ObjectID INTEGER NULL,
PRIMARY KEY (ObjectID),
FOREIGN KEY (LeftOverbank_ObjectID) REFERENCES Overbank (ObjectID) ON DELETE CASCADE,
FOREIGN KEY (RightOverbank_ObjectID) REFERENCES Overbank (ObjectID) ON DELETE CASCADE,
);
CREATE INDEX IX_FK_CrossSection_LeftOverbank ON CrossSection (LeftOverbank_ObjectID);
CREATE INDEX IX_FK_CrossSection_RightOverbank ON CrossSection (RightOverbank_ObjectID);
OverBank 表
CREATE TABLE Overbank (
ObjectID INTEGER NOT NULL,
Station real NULL,
DisplayLabel text NULL,
Description text NULL,
Name text NULL,
PRIMARY KEY (ObjectID),
);
为了启用级联删除,我在 OnModelCreating 事件中写了以下内容:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity <CrossSection>()
.ToTable("CrossSection");
modelBuilder.Entity <Overbank>()
.ToTable("Overbank");
modelBuilder.Entity<CrossSection>().HasOptional(xs => xs.LeftOverbank).WithMany().WillCascadeOnDelete(true);
modelBuilder.Entity<CrossSection>().HasOptional(xs => xs.RightOverbank).WithMany().WillCascadeOnDelete(true);
base.OnModelCreating(modelBuilder);
}
我们可以看到外键约束被颠倒了。此外,当我删除与过岸相关的横截面时,不会被删除,而当我删除与过岸相关的横截面时,会被删除。而我们需要的正好与我们现在所拥有的相反。有没有很傻的东西。
【问题讨论】:
-
这就是你写的所有映射配置吗?还是还有更多?
-
我已经编辑了完整的 OnModelCreating 事件。
标签: c# entity-framework sqlite ef-code-first cascade