asp.net-mvc-5 – EntityFramework 6 – 处理用户定义的属性
祝大家新年快乐!我刚刚开始为运行工具招聘业务的客户端建模ASP.NET MVC 5应用程序.部分解决方案涉及构建管理(后端)功能,管理员用户可以通过该功能创建/编辑从特定工具组附加到每个工具的自定义属性或工具元数据.我正在研究的概念是,在运行时,应用程序不应该知道元数据架构将是什么.所以我从这开始:
是的,我知道……另一个EAV噩梦!我知道如果数据被正确地规范化,并且创建了相关的索引,那么它应该不会太糟糕.但老实说,我没有看到任何其他选择.例如: 博世无绳电钻 >工具组:钻头 现在这些属性将用于3个目的: >在前端显示为“规格” 所以我想我为此坚持使用RDBMS(SQL Server).我知道对此采用一种流行的方法是使用一些NoSQL解决方案,但说实话,我没有太多的实践经验来与MSSQL一起使用它.我可以将Values表合并到一个表中,其中每个数据类型值都在它自己的列中,但这将留下很多空值来应对. 如果你能帮助我,我会留下以下问题: >这个模型是否符合我的要求?我不确定我是否正确设计了MetaAttributeListOption表的关系. 我非常感谢StackOverflow社区提供的任何帮助.如果您需要更多信息,请告诉我,如果您认为不合适,请不要关闭此信息,因为我认为我的问题与编程相关.谢谢! 编辑: 解决方法
>问题的模型看起来可行,并且关系配置正确,但如果存在大量重复项,则可以创建冗余的OptionLabel.但是,我会做出一些改变和去正常化的妥协. (见#3)
>根据您的过滤和报告要求以及MSSQL的相对舒适度,我认为使用RDBMS是您最好的选择 >我已经看到下面显示的方法在其他一些开发人员的API中使用,并且它似乎是一个很好的折衷方案,不太规范化,但使数据模型更简单,并且更灵活地查询值 >我添加了MetaAttributeList以允许一个列表应用于多个MetaAttributes.在此模型中,布尔值将表示为是/否列表选项. 注意:由于未指定EF方法和语言,因此我使用了EF Code First和VB.Net. IMO迁移和更容易过渡到EF7是足以使用Code First的原因.我更喜欢VB.Net的可读性,但如果需要(或使用this转换器),我很乐意改为C#. Imports System.ComponentModel.DataAnnotations Namespace Models 'I didn't bother specifying string lengths with <StringLength(#)> Public Class HireTool Public Property Id As Integer '... other properties 'Navigation Properties Public Overridable Property HireToolMetaAttributes As ICollection(Of HireToolMetaAttribute) End Class Public Class MetaAttribute Public Enum MetaAttributeTypeEnum Text = 1 ListItem = 2 End Enum Public Property Id As Integer Public Property Code As String Public Property Label As String Public Property Type As MetaAttributeTypeEnum Public Property Required As Boolean Public Property Position As Integer 'Navigation Properties Public Overridable Property List As MetaAttributeList End Class Public Class MetaAttributeList Public Property ID As Integer Public Property Name As String 'Navigation Properties <Required> Public Property ListOptions As ICollection(Of MetaAttributeListOption) End Class Public Class MetaAttributeListOption Public Property Id As Integer Public Property OptionLabel As String End Class Public Class HireToolMetaAttribute Public Property Id As Integer <Schema.Index> <StringLength(1000)> Public Property Value As String <Required> Public Overridable Property HireTool As HireTool <Required> Public Overridable Property MetaAttribute As MetaAttribute End Class End Namespace 编辑:这是生成的SQL: CREATE TABLE [dbo].[MetaAttributeLists] ( [ID] INT IDENTITY (1,1) NOT NULL,[Name] NVARCHAR (MAX) NULL,CONSTRAINT [PK_dbo.MetaAttributeLists] PRIMARY KEY CLUSTERED ([ID] ASC) ); CREATE TABLE [dbo].[HireTools] ( [Id] INT IDENTITY (1,CONSTRAINT [PK_dbo.HireTools] PRIMARY KEY CLUSTERED ([Id] ASC) ); CREATE TABLE [dbo].[MetaAttributeListOptions] ( [Id] INT IDENTITY (1,[OptionLabel] NVARCHAR (MAX) NULL,[MetaAttributeList_ID] INT NULL,CONSTRAINT [PK_dbo.MetaAttributeListOptions] PRIMARY KEY CLUSTERED ([Id] ASC),CONSTRAINT [FK_dbo.MetaAttributeListOptions_dbo.MetaAttributeLists_MetaAttributeList_ID] FOREIGN KEY ([MetaAttributeList_ID]) REFERENCES [dbo].[MetaAttributeLists] ([ID]) ); CREATE TABLE [dbo].[MetaAttributes] ( [Id] INT IDENTITY (1,[Code] NVARCHAR (MAX) NULL,[Label] NVARCHAR (MAX) NULL,[Type] INT NOT NULL,[Required] BIT NOT NULL,[Position] INT NOT NULL,[List_ID] INT NULL,CONSTRAINT [PK_dbo.MetaAttributes] PRIMARY KEY CLUSTERED ([Id] ASC),CONSTRAINT [FK_dbo.MetaAttributes_dbo.MetaAttributeLists_List_ID] FOREIGN KEY ([List_ID]) REFERENCES [dbo].[MetaAttributeLists] ([ID]) ); CREATE TABLE [dbo].[HireToolMetaAttributes] ( [Id] INT IDENTITY (1,[Value] NVARCHAR (1000) NULL,[HireTool_Id] INT NOT NULL,[MetaAttribute_Id] INT NOT NULL,CONSTRAINT [PK_dbo.HireToolMetaAttributes] PRIMARY KEY CLUSTERED ([Id] ASC),CONSTRAINT [FK_dbo.HireToolMetaAttributes_dbo.HireTools_HireTool_Id] FOREIGN KEY ([HireTool_Id]) REFERENCES [dbo].[HireTools] ([Id]) ON DELETE CASCADE,CONSTRAINT [FK_dbo.HireToolMetaAttributes_dbo.MetaAttributes_MetaAttribute_Id] FOREIGN KEY ([MetaAttribute_Id]) REFERENCES [dbo].[MetaAttributes] ([Id]) ON DELETE CASCADE ); GO CREATE NONCLUSTERED INDEX [IX_Value] ON [dbo].[HireToolMetaAttributes]([Value] ASC); GO CREATE NONCLUSTERED INDEX [IX_HireTool_Id] ON [dbo].[HireToolMetaAttributes]([HireTool_Id] ASC); GO CREATE NONCLUSTERED INDEX [IX_MetaAttribute_Id] ON [dbo].[HireToolMetaAttributes]([MetaAttribute_Id] ASC); GO CREATE NONCLUSTERED INDEX [IX_MetaAttributeList_ID] ON [dbo].[MetaAttributeListOptions]([MetaAttributeList_ID] ASC); GO CREATE NONCLUSTERED INDEX [IX_List_ID] ON [dbo].[MetaAttributes]([List_ID] ASC); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – Elmah vs Elmah.MVC Nuget软件包 – 哪些使用和
- ASP.NET MVC Liu_Cabbage 个人博客
- Asp.Net MVC3到MVC4升级工具?
- asp.net – 高级:HttpModule Init()方法在应用程序的生命中
- asp.net-mvc – 是否可以使用RedirectToAction清除路由值?
- asp.net – 在IIS7.5中不可见的无扩展名图像文件
- asp.net-mvc – 使用ASPX View Engine与MVC 5
- asp.net-mvc-3 – 如何从部分视图将JavaScript渲染到Master
- asp.net-mvc – MVC EditorFor里面的另一个EditorFor
- asp.net – executionTimeout和Server.ScriptTimeout之间的