我将 EF5 与 Code First 和 Fluent Mapping Approach 结合使用。这是我的场景,为清楚起见进行了精简:
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,not null 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()”映射,这对我来说是违反直觉的!