实体框架4 - 与CTP5视图的一对多关系(代码优先)

时间:2011-03-08 14:28:19

标签: entity-framework-4 poco code-first entity-framework-ctp5 ef-code-first

我正在尝试映射两个实体之间的1-M关系,其中第一个通常映射到一个表,第二个从视图中获取。

涉及的实体是:

public class Institute
{
    public int Id { get; set; }
    public string Name { get; set; }
    //...
    public virtual ICollection<Text> Texts { get; set; }
}

public class Text
{
    public int InstituteId { get; set; }
    public int TextId { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
    public bool IsRequired { get; set; }
    public int? MaxLength { get; set; }
}

相关的映射代码是:

private void MapInstituteText(EntityTypeConfiguration<InstituteText> text)
{
    //From a view
    text.HasKey(i => i.InstituteId)
        .ToTable("vwInstituteTexts");

    text.Property(i => i.InstituteId)
        .HasColumnName("FKInstituteID")
        .IsRequired();

    text.Property(i => i.TextPropertyId)
        .HasColumnName("FKTextPropertyID")
        .IsRequired();

    text.Property(i => i.Name)
        .HasColumnName("Name")
        .IsRequired();

    text.Property(i => i.Value)
        .HasColumnName("Value");

    text.Property(i => i.IsRequired)
        .IsRequired();

    text.Property(i => i.MaxLength);
}

private void MapInstitute(EntityTypeConfiguration<Institute> institute)
{
    institute.HasKey(i => i.Id)
        .ToTable("Institutes");

    institute.Property(i => i.Id)
        .HasColumnName("ID")
        .IsRequired();

    institute.Property(i => i.Name)
        .HasColumnName("Name")
        .HasMaxLength(128)
        .IsRequired();

    institute
        .HasMany(i => i.Texts)
        .WithRequired()
        .HasForeignKey(t => t.InstituteId);
}

问题是模型未经过验证:

  

初始化方法   Studentum.Core.Tests.InstituteTests.Initialize   扔了例外。   System.TypeInitializationException:   System.TypeInitializationException:   类型初始值设定项   'Studentum.Core.FluentCoreRepositoryFactory'   抛出一个例外。 ---&GT;   System.Data.Entity.ModelConfiguration.ModelValidationException:   一个或多个验证错误   在模型生成期间检测到:

     

System.Data.Edm.EdmAssociationEnd ::   多重性在角色中无效   'Institute_InnerInstituteTexts_Target'   谈恋爱   'Institute_InnerInstituteTexts'。   因为依赖角色是指   关键属性,上界   依赖角色的多样性   必须是1。   (异常的名称不能完全匹配,因为我专门为这篇文章重新创建了一些代码)

如果我删除“.HasForeignKey(t =&gt; t.InstituteId);”生成的查询包含对名为InstituteId1的字段的引用,该字段在查询的视图中不存在

exec sp_executesql N'SELECT 
[Extent1].[FKInstituteID] AS [FKInstituteID], 
[Extent1].[FKTextPropertyID] AS [FKTextPropertyID], 
[Extent1].[Name] AS [Name], 
[Extent1].[Value] AS [Value], 
[Extent1].[IsRequired] AS [IsRequired], 
[Extent1].[MaxLength] AS [MaxLength], 
[Extent1].[InstituteId1] AS [InstituteId1]
FROM [institute].[vwInstituteTexts] AS [Extent1]
WHERE [Extent1].[InstituteId1] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=1360

有什么建议吗?感谢。

1 个答案:

答案 0 :(得分:3)

显然您的View似乎没有所需的密钥。 尝试更改

text.HasKey(i => i.InstituteId)
        .ToTable("vwInstituteTexts");


text.HasKey(i => new {i.InstituteId, i.TextId}).ToTable("vwInstituteTexts")

这有助于识别关系以及关键TextId。

相关问题