你可以自定义的自参考实体的外键的名称在实体框架?(Can you customise foreign

2019-10-19 09:31发布

一些在我的应用程序中的实体都对他们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"));
    }

这在大多数情况下工作正常,但不是在用户类,这当然有自身的递归关系。 我已经在网上看到这表明实体框架有一个错误,当您尝试自定义在这种情况下连接表的列名,例如在不同的岗位:

自引用许多一对多递归关系码第一实体框架

http://social.msdn.microsoft.com/Forums/en-US/f058097d-a0e7-4393-98ef-3b13ab5b165d/code-first-sequence-contains-more-than-one-matching-element-exception-when-发生-模式?论坛= adonetefx

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

有谁知道这是否已被固定在实体框架6?

非常感谢。

Answer 1:

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

类:

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

    public virtual User UpdatedBy { get; set; }
}

流利的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" ) );

结果:



文章来源: Can you customise foreign key names in self referencing entities in entity framework?