2013-05-17 17 views
2

我有一個Asp_Users表和一個Resource表。在實體框架的世界裏,我有一個Asp_Users POCO和一個Resource POCO。此外,Resource POCO是抽象的,並且是每個層級模型的一部分。逐層表格模型具有摘要Resource POCO和幾個Concrete POCO,如ILCResource POCO和SectionResource POCO。從Asp_Users POCO(單邊)到Resource POCO(多邊)有一對多(1到0 ... *)的關係。爲什麼在類型''上聲明的導航屬性「'已配置爲衝突多重性。錯誤顯示?

這裏是我的aspnet_Users POCO的相關部分:

public partial class aspnet_Users 
{ 
    public aspnet_Users() { } 

    public virtual System.Guid ApplicationId { get; set; } 
    public virtual System.Guid UserId { get; set; } 
    public virtual string UserName { get; set; } 
    public virtual string LoweredUserName { get; set; } 
    public virtual string MobileAlias { get; set; } 
    public virtual bool IsAnonymous { get; set; } 
    public virtual System.DateTime LastActivityDate { get; set; } 

    public virtual ICollection<Resource> associatedResources { get; set; } 
} 

這裏是Asp_Users我映射配置

public class Aspnet_UsersMap : EntityTypeConfiguration<PerlsData.Domain.aspnet_Users> 
{ 
    public Aspnet_UsersMap() 
    { 
     this.ToTable("aspnet_Users", schemaName: "dbo"); 

     this.HasKey(u => u.UserId); 

     this.Property(u => u.UserId) 
      .HasColumnName("UserId") 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
     this.HasOptional(u => u.associatedResources); 
    } 
} 

這裏是我的抽象資源POCO類的相關部分:

public abstract class Resource 
{ 
    public Resource(){ 
     // associatedPerspectives = new HashSet<Perspective>(); 
    } 

    public virtual System.Guid ResourceDatabaseID { get; set; } 
    public virtual string ResourceName { get; set; } 
    public virtual string DescriptionOfResource { get; set; } 
    public virtual System.Guid UserId { get; set; } 
    public virtual Nullable<System.Guid> DepartmentDatabaseID { get; set; } 
    public virtual string ResourceStatus { get; set; } 
    public virtual Nullable<short> isRemoved { get; set; } 

    public virtual Department Department { get; set; } 

    public virtual System.Guid UserId { get; set; } 
    public virtual aspnet_Users aspnet_Users { get; set; } 


    public virtual ICollection<ResourceOverToILCResourcesBridge> associatedResourceOverToILCResourcesBridgeEntry { get; set; } 
} 

這是我的資源映射配置:

public class ResourceMap : EntityTypeConfiguration<Resource> 
{ 

    public ResourceMap() 
    { 
     this.ToTable("Resources", schemaName: "dbo"); 

     this.Property(r => r.ResourceDatabaseID) 
      .HasColumnName("ResourceDatabaseID"); 

     this.HasKey(r => r.ResourceDatabaseID); 

     this.Property(x => x.ResourceDatabaseID) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
     // .StoreGeneratedPattern = StoreGeneratedPattern.Identity; 
     this.Property(r => r.ResourceName) 
      .HasColumnName("ResourceName"); 

     this.Map<PerlsData.Domain.OtherItem>(m => m.Requires("discriminator").HasValue("otheritems")) 
     .Map<PerlsData.Domain.Audioitem>(m => m.Requires("discriminator").HasValue("audioitems")) 
     .Map<PerlsData.Domain.Imageitem>(m => m.Requires("discriminator").HasValue("imageitems")) 
     .Map<PerlsData.Domain.Videoitem>(m => m.Requires("discriminator").HasValue("videoitems")) 
     .Map<PerlsData.Domain.UriItem>(m => m.Requires("discriminator").HasValue("uriitems")) 
     .Map<PerlsData.Domain.Documentitem>(m => m.Requires("discriminator").HasValue("documentitems")) 
     .Map<PerlsData.Domain.DatabaseFileItem>(m => m.Requires("discriminator").HasValue("databasefileitems")); 

     this.HasOptional(res => res.associatedResourceOverToILCResourcesBridgeEntry); 

     this.HasRequired(res => res.aspnet_Users) 
      .WithMany(u => u.associatedResources) 
      .HasForeignKey(res => res.UserId); 
    } 
} 

請問您爲什麼會出現以下錯誤?

導航屬性「associatedResources」上型 「PerlsData.Domain.aspnet_Users」宣佈已經配置了相互矛盾的 多重。

請解釋爲什麼在我創建POCO類中的映射後它仍然爲NULL。

enter image description here

+0

大多數配置代碼只是重申EF可以自動推斷的默認值;你可以擺脫幾乎所有的。 – SLaks

+0

@SLaks我在調試模式下附加了Visual Studio的圖片快照。您能否告訴我爲什麼即使在映射編碼之後,aspnet_Users關聯爲空? – user1338998

回答

0

我需要學習更多有關IQueryable和/或與用於檢索數據lambda表達式查詢一起IEnumerable集合,並將它們放置在上述IQueryable和/或IEnumerable

我的問題是,我試圖檢索循環內的特定POCO的關聯,該循環遍歷了IQueryable和/或IEnumerable集合。

這裏是故障代碼(我們訪問的關聯,而我們遍歷IQueryable):

resourcestempIQueryable = context.Resources; 
foreach (PerlsData.Domain.Resource tempRes in resourcestempIQueryable) 
{ 
    string[] resourceRow = { tempRes.ResourceName, 
          tempRes.DescriptionOfResource, 
          tempRes.UploadDate.ToString(), 
          tempRes.Iconpath, 
          tempRes.aspnet_Users.UserName, // Error 
          tempRes.ResourceDatabaseID.ToString() }; 
    tempDataTableForResources.Rows.Add(resourceRow); 
} 

這裏是一個應該解決問題的正確代碼:

using (PerlsData.Context context = new PerlsData.Context()) 
{ 
    context.Configuration.LazyLoadingEnabled = true; 
    context.Configuration.ProxyCreationEnabled = true; 
    resourcesIEnumerable = context.Resources.ToList<PerlsData.Domain.Resource>(); 

    var entityValuesWithFieldsToShowInAllResourcesPage = context.Resources.Select(res => new { res.ResourceName, res.DescriptionOfResource, res.UploadDate, res.Iconpath, res.aspnet_Users.UserName, res.ResourceDatabaseID }); 

    foreach (var varForIteratingOverEntityValuesWithFieldsToShowInAllResourcesPage in entityValuesWithFieldsToShowInAllResourcesPage) 
    { 
     string[] resourceRow = { 
      varForIteratingOverEntityValuesWithFieldsToShowInAllResourcesPage.ResourceName, 
      varForIteratingOverEntityValuesWithFieldsToShowInAllResourcesPage.DescriptionOfResource, 
      varForIteratingOverEntityValuesWithFieldsToShowInAllResourcesPage.UploadDate.ToString(), 
      varForIteratingOverEntityValuesWithFieldsToShowInAllResourcesPage.Iconpath, 
      varForIteratingOverEntityValuesWithFieldsToShowInAllResourcesPage.UserName, 
      varForIteratingOverEntityValuesWithFieldsToShowInAllResourcesPage.ResourceDatabaseID.ToString() 
     }; 
     tempDataTableForResources.Rows.Add(resourceRow); 
    } 
} 
+0

@SLaks感謝您的幫助。我在回覆中發佈了我的回覆。 – user1338998

6
this.HasOptional(u => u.associatedResources); 

這是不對的。 HasOptional表示0..1
您想要HasMany()

事實上,你可以完全擺脫那條線; EF可以從房產中找出它。

相關問題