您可以在实体框架中的自引用实体中自定义外键名称吗?

时间:2014-02-19 10:57:35

标签: c# .net entity-framework ef-code-first entity-framework-6

我的应用程序中的一些实体有4个审核属性:

    public virtual DateTime WhenAdded { get; set; }

    public virtual DateTime? WhenUpdated { get; set; }

    public virtual User AddedBy { get; set; }

    public virtual User UpdatedBy { get; set; }

我正在使用代码优先方法并使用以下扩展方法来映射用户属性:

    public static void MapAuditFields<T>(this EntityTypeConfiguration<T> configuration) where T : class, IAuditable
    {
        configuration.HasOptional<User>(e => e.AddedBy)
            .WithOptionalDependent()
            .Map(a => a.MapKey("AddedByUserId"));
        configuration.HasOptional<User>(e => e.UpdatedBy)
            .WithOptionalDependent()
            .Map(a => a.MapKey("UpdatedByUserId"));
    }

这在大多数情况下都能正常工作,但在User类上却没有,当然它与自身有递归关系。我在互联网上看到过各种帖子,当你尝试在这种情况下自定义连接表列名时,实体框架有一个错误,例如:

Self-referencing many-to-many recursive relationship code first Entity Framework

http://social.msdn.microsoft.com/Forums/en-US/f058097d-a0e7-4393-98ef-3b13ab5b165d/code-first-sequence-contains-more-than-one-matching-element-exception-when-generating-schema?forum=adonetefx

我得到的错误是“序列包含多个匹配元素”。

是否有人知道这是否已在实体框架6中修复?

非常感谢。

1 个答案:

答案 0 :(得分:2)

使用WithMany()代替WithOptionalDependent(),因为用户可以添加或更新多个其他用户

类别:

public class User
{
    public int Id { get; set; }
    public virtual User AddedBy { get; set; }

    public virtual User UpdatedBy { get; set; }
}

Fluent API调用:

        modelBuilder.Entity<User>()
            .HasOptional( u => u.AddedBy )
            .WithMany()
            .Map( fkamc => fkamc.MapKey( "AddedByUserId" ) );

        modelBuilder.Entity<User>()
            .HasOptional( u => u.UpdatedBy )
            .WithMany()
            .Map( fkamc => fkamc.MapKey( "UpdatedByUserId" ) );

结果:

results