我正在尝试使用我继承的旧版MS SQL数据库使用Entity Framework 4.0构建一个通用存储库。一个非常熟悉的场景。
我需要将类别信息添加到相当长的现有项目列表中。
这些项目可以同时属于多个类别,所以我创建了一个名为 CategoryMapping
的映射表
不幸的是, SchemaDefinitionCode 不是唯一的,不能在数据库中变成外键(FK)。
我曾尝试将自己的部分类添加到DefinitionSchema实体,但由于它没有编入索引,因此性能受到严重影响。 用于测试的演示代码,我不想在每次加载时创建新的上下文:
public partial class DefinitionSchema
{
private MyEntities context;
public IQueryable<Category> Categories
{
get
{
context = new MyEntities();
var categories = context.Categories
.Where(c => c.CategoryMappings
.Where(m => m.SchemaDefinitionCode == this.SchemaDefinitionCode).Any());
return categories;
}
}
}
然后我可以调用这样的项目列表:
var q = context.SchemaDefinitions
.Where(s => s.Categories
.Where(c => c.Name == category)
.Any()
);
如何在不消除现有数据库结构的情况下以最有效的方式链接我的表和映射?
答案 0 :(得分:0)
它不能以这种方式工作,因为EF不支持唯一键,SchemaDefinitionCode
必须是唯一的才能与Category
形成有效的多对多关系。如果您的SchemaDefinitionCode
在DefinitionSchema
表中不唯一,则不能将其用作与CatagoryMapping
的关系中的主要结尾。如果它是唯一的,则可以使用SchemaDefinitionID
代替,因为不超过一个Id将具有相同的代码值。