【问题标题】:Why is The navigation property '' declared on type '' has been configured with conflicting multiplicities. error show up?为什么在类型“”上声明的导航属性“”已配置有冲突的多重性。错误出现?
【发布时间】:2013-05-17 20:09:50
【问题描述】:

我有一个Asp_Users 表和一个Resource 表。在实体框架世界中,我有一个Asp_Users POCO 和一个Resource POCO。此外,Resource POCO 是抽象的,是 Table-per-Hierarchy 模型的一部分。 Table-per-Hierarchy 模型具有抽象的Resource POCO 和几个Concrete POCO,例如ILCResource POCO 和SectionResource POCO。从Asp_UsersPOCO(单边)到ResourcePOCO(多边)之间存在一对多(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);
    }
} 

这是我的抽象 Resource 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);
    }
}

您能告诉我为什么会出现以下错误吗?

在类型上声明的导航属性“关联资源” 'PerlsData.Domain.aspnet_Users' 已配置为冲突 多重性。

请解释为什么我在 POCO 类中创建映射后它仍然为 NULL。

【问题讨论】:

  • 您的大部分配置代码只是重申 EF 可以自动推断的默认值;你几乎可以摆脱它。
  • @SLaks 我附上了调试模式下 Visual Studio 的图片快照。你能告诉我为什么 aspnet_Users 关联在映射被编码后仍然为 Null 吗?

标签: c# entity-framework mapping associations one-to-many


【解决方案1】:
this.HasOptional(u => u.associatedResources);

错了。 HasOptional 表示0..1
你想要HasMany()

事实上,你可以完全摆脱那条线; EF可以从属性中算出来。

【讨论】:

    【解决方案2】:

    我需要进一步研究IQueryable 和/或IEnumerable 集合以及用于检索数据的lambda 表达式查询,并将它们放在上述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);
        }
    }
    

    【讨论】:

    • @SLaks 感谢您愿意提供帮助。我将我的回复放在帖子中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    相关资源
    最近更新 更多