我的应用程序中的一些实体有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
和
我得到的错误是“序列包含多个匹配元素”。
是否有人知道这是否已在实体框架6中修复?
非常感谢。
答案 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" ) );
结果: