0

我正在使用实体框架和流畅的 API 来配置绑定。我的两个实体如下所示:

public class Matter
{
    #region Properties

    /// <summary>
    /// Primary key
    /// </summary>
    public int Id { get; set; }

    /// <summary>
    /// Navigation: the most recent Relativity activity for the Matter
    /// </summary>
    public virtual RelativityActivity RelativityRecentActivity { get; set; }

    #endregion
}

public class RelativityActivity
{
    #region Properties

    /// <summary>
    /// Primary key
    /// </summary>
    public int Id { get; set; }

    /// <summary>
    /// Foreign key: the Matter that the Relativity Activity entry is associated with
    /// </summary>
    public Matter Matter { get; set; }

    #endregion
}

我正在使用现有的表模式,并且在模式中,表只是有一个指向'列RelativityActivity的外键。因此,是关系中的主体,并且可以在没有 的情况下存在。没有a就不能存在MatterIdMatterRelativityActivityRelativityActivityMatter但是,

对于我的一生,我似乎无法将其配置为按预期工作。我已经阅读了大量关于 SO 的答案,并且在阅读完每个答案后都调整了我的流畅 API 绑定,但我似乎总是遇到错误,从“无法确定关系的主体端”到“你配置了不正确的多重性” .

我当前的 fluent API 绑定如下所示:

modelBuilder.Entity<RelativityActivity>().HasRequired(m => m.Matter).WithRequiredDependent(m => m.RelativityRecentActivity).Map(m => m.MapKey("matter")).WillCascadeOnDelete(true);

对于RelativityActivity, 和:

modelBuilder.Entity<Matter>().HasOptional(m => m.RelativityRecentActivity).WithRequired(m => m.Matter);

为了Matter.

我在关系中有两个绑定,因为没有Matter绑定我无法确定主体结束错误。但现在我得到一个关于多重性的错误。

编辑澄清:

表中的外键列RelativityActivity不是Id列。它实际上是另一个名为matter. 我尝试使用Map绑定中的函数来指定它。

4

1 回答 1

1

db 模式只能强制执行0..1 - n关联。关联总是涉及两个相互引用的1:1外键,或者一个主键同时是另一个主键的外键。

您可以按照您的方式为 1:1 关联建模:

modelBuilder.Entity<Matter>().HasOptional(m => m.RelativityRecentActivity)
                             .WithRequired(m => m.Matter);

问题是 EF 会假设数据库模式也适应 1:1 关联。

如果要保存 aMatter和一个RelativityRecentActivity对象,EF 将插入一条Matter记录并取其 PK 值作为 PK 使用RelativityRecentActivity(假设它也是一个 FK)。所以在你的情况下,真正的外键字段永远不会被填充。除此之外,如果RelativityRecentActivity有一个自动递增的 PK(Sql Server 中的标识列),它也可能引发异常。

因此,我认为您只能将关联建模为常规的 1-many 关联,并使用业务规则来强制“many”永远不会超过 1:

modelBuilder.Entity<Matter>().HasMany(m => m.RelativityRecentActivity)
            .WithRequired(r => r.Matter)
            .Map(m => m.MapKey("matter");
于 2013-10-25T20:55:10.453 回答