实体框架4.0使用非主键的许多关系

时间:2011-04-07 13:44:45

标签: sql-server entity-framework-4 legacy-database

我正在尝试使用我继承的旧版MS SQL数据库使用Entity Framework 4.0构建一个通用存储库。一个非常熟悉的场景。

我需要将类别信息添加到相当长的现有项目列表中。

这些项目可以同时属于多个类别,所以我创建了一个名为 CategoryMapping

的映射表

Database Diagram

不幸的是, 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()
 );

如何在不消除现有数据库结构的情况下以最有效的方式链接我的表和映射?

1 个答案:

答案 0 :(得分:0)

它不能以这种方式工作,因为EF不支持唯一键,SchemaDefinitionCode必须是唯一的才能与Category形成有效的多对多关系。如果您的SchemaDefinitionCodeDefinitionSchema表中不唯一,则不能将其用作与CatagoryMapping的关系中的主要结尾。如果它是唯一的,则可以使用SchemaDefinitionID代替,因为不超过一个Id将具有相同的代码值。