2014-02-19 32 views
1

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

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

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?

非常感谢。

回答

2

使用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")); 

结果:

results

+0

非常感谢您的答复,但不幸的是,这给出了同样的错误。 – gusgorman

+0

它适用于我 – Moho

+0

好吧,嗯,奇怪。你能分享一下你如何在你的其他实体上映射审计字段吗? – gusgorman