我正在尝试映射两个实体之间的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
有什么建议吗?感谢。
答案 0 :(得分:3)
显然您的View似乎没有所需的密钥。 尝试更改
text.HasKey(i => i.InstituteId)
.ToTable("vwInstituteTexts");
到
text.HasKey(i => new {i.InstituteId, i.TextId}).ToTable("vwInstituteTexts")
这有助于识别关系以及关键TextId。