我正在开发一个使用Entity Framework从第三方应用程序查询数据库的应用程序。数据库有大量表,没有外键。我已使用Entity Framework Fluent API将相关表映射到实体。
namespace App.Entities
{
public class Ticket
{
public int Id { get; set; }
public virtual SalesOrder SalesOrder { get; set; }
public int SalesOrderId { get; set; }
}
public class SalesOrder
{
public int Id { get; set; }
public virtual ICollection<Ticket> Tickets { get; set; }
public virtual ICollection<Ticket> Lines { get; set; }
}
}
请注意,省略了列和表名称映射,因为我认为它们不相关。
namespace App.Mappings
{
public class TicketMap : EntityTypeConfiguration<Ticket>
{
public TicketMap() {}
}
public class SalesOrderMap : EntityTypeConfiguration<SalesOrder>
{
public SalesOrderMap()
{
HasMany(t => t.Tickets)
.WithRequired(t => t.SalesOrder)
.HasForeignKey(t => t.SalesOrderId);
HasMany(t => t.Lines)
.WithRequired(t => t.SalesOrder)
.HasForeignKey(t => t.SalesOrderId);
}
}
}
实体及其映射已在Entity Framework中正确注册。
当我尝试运行查询时,我收到以下MetadataException
:
指定的架构无效。错误:未加载“App.SalesOrder_Tickets”关系,因为“App.Ticket”类型不可用。
请注意,上述消息中显示的Ticket
命名空间是错误的。实体类实际上在App.Entities.Ticket
中。但是,我不知道这是否与问题有关。
答案 0 :(得分:4)
问题出在这两行:
public virtual ICollection<Ticket> Tickets { get; set; }
public virtual ICollection<Ticket> Lines { get; set; }
第二个集合的元素类型应该与第一个集合的元素类型不同:
public virtual ICollection<TicketLine> Lines { get; set; }
更改此问题解决了问题。
答案 1 :(得分:2)
我有同样的错误消息,对我来说问题是我有两个不同的edmx模型,其实体名称相同。我想EF无法加载一些相关的实体,并给出了一个消息。
我解决了从一个模型中删除实体的问题(更改名称也可以正常工作)并重建解决方案。