【发布时间】:2013-03-01 11:23:59
【问题描述】:
我正在使用带有代码优先和流畅映射方法的 EF5。这是我的场景,为了清楚起见,进行了精简:
public class SecuritySettings
{
public int Id { set; set }
public Company Company { get; set; }
public int MaximumInvalidPasswordAttempts { get; set;
// etc.
}
public class Company
{
public int Id { set; set }
public string Name { get; set; }
public SecuritySettings InternalUserSecuritySettings { get; set; }
public SecuritySettings ExternalUserSecuritySettings { get; set; }
}
仅凭上述内容,我在 Company 表中获得了两个 FK:
InternalUserSecuritySettings_Id int, null
ExternalUserSecuritySettings_Id int, null
到目前为止,一切都很好。
我有用于设置流利映射的配置类 - 一个用于公司,一个用于 SecuritySettings。这些规定了所需的属性。在公司配置中,如果我执行以下操作:
HasRequired(x => x.InternalUserSecurityConfiguration);
这会导致:
InternalUserSecuritySettings_Id int,不为空 ExternalUserSecuritySettings_Id int, null
但是,如果我再添加这个:
HasRequired(x => x.ExternalUserSecurityConfiguration);
我得到以下异常:
在表“Companies”上引入 FOREIGN KEY 约束“FK_dbo.Companies_dbo.SecuritySettings_ExternalUserSecurityConfiguration_Id”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
我试过了:
- .WithRequiredDependent(y => y.Company).WillCascadeOnDelete(false)
- .WithRequiredDependent(y => y.Company).Map(m => m.MapKey("ExternalUSC_Id"))
在其他此类排列中,但要么我得到一个异常,要么只创建了一个 FK。 我想在实体配置的流畅映射中执行此操作 - 最好是公司之一。 我是否遗漏了一些明显的东西。从使用非空值如此简单和琐碎的事情到发现很难简单地规定我想要一个密钥,并且两者都不能为空值,这似乎是一种耻辱。
我确实找到了一种方法,通过为实际的外键使用单独的属性来使其工作,但首先,对于非空要求来说,这似乎是一项额外的工作,其次,我必须在OnModelCreating 方法使用“WithMany()”映射,这对我来说是违反直觉的!
【问题讨论】:
标签: entity-framework ef-code-first