.net 实体框架是否可以实现ORM?

.net 实体框架是否可以实现ORM?,.net,database,entity-framework,orm,.net,Database,Entity Framework,Orm,我们正在尝试使用ORM在域实体和使用EF的表之间实现一个数据层。我们已经成功地对与各自表非常相似的域实体进行了琐碎的映射,但在尝试映射具有更复杂关系的对象(这些关系在表表示中包含外键)时遇到了问题。我发现了很多关于使用EF对共享主键的表进行“表拆分”的引用,但我们的模式并非如此 例如,我希望将域实体作为POCO,而不比简单ID更了解数据层: public class EntityInfo { public int EntityId { get; set; } public str

我们正在尝试使用ORM在域实体和使用EF的表之间实现一个数据层。我们已经成功地对与各自表非常相似的域实体进行了琐碎的映射,但在尝试映射具有更复杂关系的对象(这些关系在表表示中包含外键)时遇到了问题。我发现了很多关于使用EF对共享主键的表进行“表拆分”的引用,但我们的模式并非如此

例如,我希望将域实体作为POCO,而不比简单ID更了解数据层:

public class EntityInfo
{
    public int EntityId { get; set; }
    public string EntityName { get; set; }
    public string TypeName { get; set; }
    public string ComponentName { get; set; }
}

public class Entity
{
    public int EntityId { get; set; }
    public EntityType Type { get; set; }
    public EntitySource Source { get; set; }
    public string Name { get; set; }
}

public class EntityType
{
    public int TypeId { get; set; }
    public string Name { get; set; }
}

public class EntitySource
{
    public int SourceId { get; set; }
    public string Name { get; set; }
}
这些将映射到一系列具有外键的等效表:

Table Entities:
[PK]    int     EntityId
[FK]    int     TypeId
[FK]    int     SourceId
        string  Name

Table EntityTypes:
[PK]    int     TypeId
        string  Name

Table EntitySources:
[PK]    int     SourceId
        string  Name

我们真正想做的是将表表示与域实体完全分离,并实现mapping layer.msl来解决这些有点复杂的关系。上面的EntityInfo类将从表中构建并存储到表中,尽管它自己没有直接的表表示。甚至可以使用.msl将多个表映射到对象层次结构吗?是否可以使用EF?

IIRC Entity Framework 1.0不允许实体与表解耦。但我相信你可以用EF4.0做到这一点,你至少试过了吗?呈现的模型中没有复杂的映射。这是一对多关系的最基本映射。只需在设计器中打开EDMX,然后从关联菜单中运行“从数据库更新”命令。在向导中选择三个表,然后取消选中向模型添加外键的选项

编辑:

是的,实体框架甚至可以映射EntityInfo对象,但该对象将是只读的,因为有关其FK关系所包含的相关实体的所有信息都将丢失。有两种方法可以映射它:

在SSDL中使用。DefiningQuery是用于加载要映射的列的自定义SQL。EF并不关心您要加入多少个表来获得结果集。问题是,每次尝试从数据库更新模型时,默认设计器都会删除您的定义查询。 在MSL中使用。QueryView是映射到新Entity的自定义实体SQL视图。它构建在模型中定义的实体上。所以您还必须映射实体、EntityType和EntitySource,但您可以将它们作为数据程序集的内部对象。QueryView可以保存来自数据库的更新。 DefiningQuery和QueryView都必须直接在以XML形式打开的EDMX中定义,因为设计器不支持它们。这些特性在代码优先方法中不可用。这些特性创建只读实体,因此,如果您还需要CUD操作,则必须创建存储过程并将它们映射到新创建的实体

还有最后一个最常用的选项-您可以创建linq到实体查询,只需将映射的实体投影到未映射的EntityInfo:


Entityframework是一个ORM…是的,我已经尝试过了,当然基本的外键关系也可以工作。这不是问题所在,我想我在我的问题或例子中没有说得足够清楚。我想做的是映射域实体,这些域实体根据主键和外键关系从多个表(如所示)中拾取和选择项。这些域实体不会与表有一对一的对应关系。根据我到目前为止使用EF的经验,它似乎只是简单地将表投影到类中,将行投影到对象中,并使用一些选项split或sparse。
var infos = context.Entities
                   .Select(e => new EntityInfo
                        {
                            EntityId = e.EntityId,
                            EntityName = e.Name,
                            TypeName = e.Type.Name,
                            ComponentName = e.Source.Name 
                        });