Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 将3个表的关系映射到单个实体。ORM最佳实践?_Database_Entity Framework_Database Design_Orm_Mapping - Fatal编程技术网

Database 将3个表的关系映射到单个实体。ORM最佳实践?

Database 将3个表的关系映射到单个实体。ORM最佳实践?,database,entity-framework,database-design,orm,mapping,Database,Entity Framework,Database Design,Orm,Mapping,经过几次尝试和一些搜索,我最终决定在这里尝试 短篇故事:我为内容管理系统应用程序创建了一个相当“规范化”的数据库设计,现在我正在尝试将其映射到EF实体。 我在页面和它们的内容之间有M:N关系(ContentVersion表)——通过表内容连接。这是因为应用程序是多语言的,我将存储内容编辑的最新历史记录 现在,我可以从我的数据库中创建DbContext,构建一些控制器,并且有一个坚实的基础,但是这会有一个问题。当我尝试创建新页面时,我基本上只允许输入标题和Slug,但该页面没有内容。当然,我可以

经过几次尝试和一些搜索,我最终决定在这里尝试

短篇故事:我为内容管理系统应用程序创建了一个相当“规范化”的数据库设计,现在我正在尝试将其映射到EF实体。

我在页面和它们的内容之间有M:N关系(ContentVersion表)——通过表内容连接。这是因为应用程序是多语言的,我将存储内容编辑的最新历史记录

现在,我可以从我的数据库中创建DbContext,构建一些控制器,并且有一个坚实的基础,但是这会有一个问题。当我尝试创建新页面时,我基本上只允许输入标题和Slug,但该页面没有内容。当然,我可以以某种方式将其与其他实体连接起来,并创建一些分层的业务逻辑,每次都会更新几个实体,但我首先想尝试一种更抽象的方法

我想我基本上需要在3个相关表上拆分实体。我想创建一个实体(我们称之为FinalPage),可以将页面作为一个整体使用->使用它构建控制器等

FinalPage是用户在创建新页面时填充的内容,因此它将包含:

标题(来自页面实体)
Slug(来自页面实体)
模板ID(来自页面实体)
LanguageId(来自内容实体)
标题(来自ContentVersion实体)
正文(来自ContentVersion实体)
+ContentVersion实体中的其他相关字段

当我为它生成“创建新”页面时,我会填充所有内容,所有内容都会保存到相应的表中

我尝试在实体模型中创建新实体,将属性映射到不同的表。。尝试了几种方法,但从未得到有效的解决方案。主要是因为典型的“需要映射每个键”错误。我正在检查,但他只连接了两个共享同一密钥的表

我也试过一些感觉很傻的东西。。。从页面和内容实体创建实体(entA)-通过PageId属性连接。以及从Content和ContentVersion创建第二个(entB),通过ContentId连接。然后我想创建连接entA和entB的第三个(entC)。这也不起作用(我真的很高兴,因为这将是一个非常奇怪的解决方案)

我觉得我是:
a、 )遗漏了一些明显的东西。
b、 )数据库设计不好。
c、 )想从英孚那里得到太多

欢迎任何帮助。
-如果你在数据库设计中看到一些糟糕的东西,请告诉我 知道。
-如果你知道如何实现我的目标,请分享。
-如果您有使用此类应用程序的经验,并且有更好的解决方案, 我想听一听。


基本上,我也在寻找一些最佳实践。

听起来你在试图让你的ORM适合你的UI模型,但这不是实现它的方法。您应该创建一个表示要从表单捕获的数据的新类,然后根据需要将其处理到各个表中。因此,创建新页面时使用的模型如下:

public class FinalPage{
    public string Title { get; set; }
    public string Slug { get; set; }
    public string Body { get; set; }
    public int TemplateId { get; set; }
    public int LanguageId { get; set; }
}
当用户提交表单时(您没有提到正在使用的UI),您会将这些值处理到各种ORM对象中

public void SaveData(FinalPage model){
    var page = new Page{
        Title = model.Title,
        ...
    };
    db.Pages.Add(page);

    var contentVersion = new ContentVersion{
        Body = model.Body,
        ...
    };
    db.ContentVersions.Add(contentVersion);

    ...
}
这是
视图模型
数据库模型
之间的区别,两者不必相同,业务逻辑应用于两个实体之间。我在以前的项目中使用过的另一种方法是使用一个类,该类包含您想要使用的ORM对象,这样您就可以在UI中获得DataAnnotation验证内容

public class FinalPage{
    public Page Page { get; set; }
    public ContentVersion ContentVersion { get; set; }
    public Content Content { get; set; }
}
然后显示每个内部对象的相应字段。在带剃须刀的MVC4中:

@Html.EditorFor(m=>m.Page.Title)

这将产生您预期的、在数据模型中定义的验证错误,但是您需要注意,您可能需要确保以后正确处理对象(例如,在MVC中,您的
ModelState
几乎总是无效的)。我个人推荐第一种方法,因为这是使用不同UI和ORM模型进行操作的传统方法。我遵循的一般规则是,如果可以的话,使用ORM模型,但一旦变得有点棘手,就切换到ViewModel类来表示您的值。

听起来您试图使ORM适合您的UI模型,但这不是实现的方法。您应该创建一个表示要从表单捕获的数据的新类,然后根据需要将其处理到各个表中。因此,创建新页面时使用的模型如下:

public class FinalPage{
    public string Title { get; set; }
    public string Slug { get; set; }
    public string Body { get; set; }
    public int TemplateId { get; set; }
    public int LanguageId { get; set; }
}
当用户提交表单时(您没有提到正在使用的UI),您会将这些值处理到各种ORM对象中

public void SaveData(FinalPage model){
    var page = new Page{
        Title = model.Title,
        ...
    };
    db.Pages.Add(page);

    var contentVersion = new ContentVersion{
        Body = model.Body,
        ...
    };
    db.ContentVersions.Add(contentVersion);

    ...
}
这是
视图模型
数据库模型
之间的区别,两者不必相同,业务逻辑应用于两个实体之间。我在以前的项目中使用过的另一种方法是使用一个类,该类包含您想要使用的ORM对象,这样您就可以在UI中获得DataAnnotation验证内容

public class FinalPage{
    public Page Page { get; set; }
    public ContentVersion ContentVersion { get; set; }
    public Content Content { get; set; }
}
然后显示每个内部对象的相应字段。在带剃须刀的MVC4中:

@Html.EditorFor(m=>m.Page.Title)
这将产生您预期的、在数据模型中定义的验证错误,但是您需要注意,您可能需要确保以后正确处理对象(例如,在MVC中,您的
ModelState
几乎总是无效的)。我个人推荐第一种方法,因为这是使用不同UI和ORM模型进行操作的传统方法。我遵循的一般规则是,u