65.9K
CodeProject 正在变化。 阅读更多。
Home

OPEN-MVC-PLUS-ENTITY-FRAMEWORK...

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2012年2月14日

BSD

8分钟阅读

viewsIcon

33852

downloadIcon

1749

Open MVC PLUS ENTITY FRAMEWORK + XML DB for WebLight Components for MVC.NET 3.0

该库旨在支持 OPEN WEBLIGHTS DBAWARE COMPONENT FOR .NET,要了解它,我将引用我上一篇关于 weblights 的文章:https://codeproject.org.cn/Articles/189276/MVC-PLUS-for-MVC-NET-3-00https://sourceforge.net/projects/mvcplus/files/Presentation%20and%20Documents/ 下载关于此开放项目的吸引人的演示文稿,或从 https://sourceforge.net/projects/mvcplus/files/ 下载示例文件。

该实体框架被设计并应用于非常大规模的项目,例如两个 ERP 系统,并支持主要的 RDBMS:MSSQL SERVER 2005 及更高版本(2012 年扩展就绪)
Oracle 10G 或更高版本
MYSQL
POSTEGRESQL
INTERBASE
FIREBIRD
IXML DB

许多用户喜欢在他们的 MVC.NET 程序中使用 DataAware 模型,同时,他们可能在使用当前实体框架时遇到问题,该实体框架是开放/易于使用的,并且特别关注 MVC 模型,通过实现 MVC 模型的附加功能,例如元模型。

此外,我希望始终拥有排序/过滤且快速的数据源,而无需使用 DataTable 之类的不良且非类型化的类,这就是我们创建这个系统的原因,它诞生于几年前的一个想法,并最终变得越来越先进,

我们将视图和模型组合成一个 3D 模型,该模型可以支持内部的递归数据,始终排序,始终过滤。

它拥有自己的 ORM,并添加了许多功能,例如(大部分内置)

  • 3D 模型而非扁平模型(完全不同的概念)
  • 内置策略模式支持
  • 更快的批量操作
  • 基于策略的高级安全模型(在元模型、模型、行、列上)
  • 锁定/解锁和版本控制以实现并发
  • 支持许多新字段,例如 XML 字段,以新的方式处理,
  • ECB(多货币,意味着用户将看到以其本国货币显示的金额,但存储不同:您输入 100 美元,但欧洲用户将看到 80 欧元)
  • 单位:您输入 2 公斤,美国用户将看到 4.2 磅

还有更多。

在示例文件中,我们提供了一些关于如何使用它的样本?语法和演示文稿 + 系统的完整源代码。

这里我们有一些示例代码

Int64 s = Environment.TickCount;
for (var t = 0; t < 500; t++)
{
    Test.Person.Insert();
    Test.Person.Name = t.ToString() + "th Name";
    Test.Person.Post();
}
Test.Person.Flash();
Test.Person.Done();
InsertLabel.Text = "500 Records are inserted in " + (s - Environment.TickCount).ToString() + " Ms";
Test = new MetaModels.Test();

我们在 Person 模型中插入了 500 条记录,在 2.66 Intel 双核系统上需要 567 毫秒。

它的语法非常类似于 Delphi,首先,您需要执行一个命令,例如 Insert、Update 或 Select,然后提交您的命令,在批量操作中,您必须刷新它们,但当您选择时,不需要刷新您的请求,最后,当您的工作完成时,您必须完成所有请求,这意味着您将清除您的请求正文。

在这个系统中,我们也有 XML 字段,但我们该如何使用它们?我们有一个处理 XML 的示例,这与所有其他可用的 XML DB 实现都不同,它在代码中内置了支持

使用和处理类似数据库模式的 WLXMLElement

var xmlelement = new WLXMLElement();
for (var T = 0; T < 200; T++)
{
    xmlelement.Insert();
    xmlelement["Person/Name"].Value = "RYAN";
    xmlelement["Person/FamilyName"].Value = "SAMIEE";
    xmlelement["Person/Age"].Value = "32";
    xmlelement["Person/Age/Description"].Value = "He is yoo young";
}
//xmlelement = WLXMLElement.LoadXML(xmlelement.ToString());

代码演示了如何轻松地在 XML 元素中插入 XML 元素,只需使用 XML 路径,例如

Person/Name/X/Y

它将创建节点,将在需要的地方插入值,然后您可以通过 SaveAsFile 命令将其保存到磁盘,或者在 ORM 中,它将是一个字段,系统将把它存储为一个字段,此外,您可以基于 XML 数据在应用程序服务器上进行排序,

授权策略

您可以拥有如下的安全模型

两者都通过硬编码和 XML 映射(用于 XML 和模型)得到支持

[ReadOnly(Where="owner!=me and owner!=admin",WhichFields("Name")]




[WriteOnly(Where=" owner!=admin",WhichFields("Password")]




[CanWrite(Where="owner!=me and owner!=admin",WhichFields("Name")]




[CanRead(Where="owner!=me and owner!=admin",WhichFields("Name")]

您可以随时通过简单的语法将它们设为只读/只写或可读/可写。

Test.Person.Update(new { name = "@EXP name+' test'" }, "");
            Test.Person.Flash();
            Test.Person.Done();

速度比较

在示例中,我们将此系统与常规批量操作的速度进行了比较,因为它使用了一种优化的方式来处理批量操作,其速度是常规代码的 4 到 10 倍,如下所示。

您还可以看到表达式系统如何处理事物,以及它创建的表达式树的示例。

请注意:

示例代码在本文的附件中 + OPEN MVC PLUS 的完整源代码。

image001.jpg

批量操作,其速度比竞争对手快几倍。

image002.jpg

表达式测试

Expression : (Name+' '+Familyname)+Replace('Ryan','R','r') 

结果:Ryan Samiee ryan

您还可以看到表达式树

Expression Library 基于 Ryan Samiee Expression Library,最初于 2002 年用 C 编写(闭源),后重写为 C# 和 Java。

注意:要运行示例,请执行以下操作

解压缩后,请修改 Project TestApplication\DAL\BaseModel 中的文件

[WLMOAdapter(WLAdapterType.MSSQL, ConnectionString: "Data
Source=.\\SQLEXPRESS;AttachDbFilename=O:\\WindowsFormsApplication9\\Backup4\\WindowsForms
Application9\\MVCPLUSTEST.mdf;IntegratedSecurity=True;User Instance=True")]

更改粗体路径(attachdbfilename 为 MVCPLUSTEST.MDF 文件的确切路径,请注意,您需要在最新的 SQL Express 和 Visual Studio 2010 上运行此示例。

更多

在下面的文本中,您可以找到有关该系统的简要信息。

另外,请下载附件或加入 MVC PLUS,网址为 http://sourceforge.net/projects/mvcplus/

请注意:您可以根据自己的方式使用 Expression 或 XML 库,它们与 MVC PLUS Entity Framework 的核心是分开的。

MVC PLUS 是一个开源实体框架,旨在支持 OPEN WEBLIGHTS,并普遍用于 MVC 和企业应用程序,如 ERP(一些 ERP 产品大量使用其动态规范),它拥有自己开发的 ORM 系统,具有新的规范,例如

  1. 内置 ECB 支持
  2. 快速可靠的表达式库
  3. 内置 XML 字段支持(带 XML DB 类型)
  4. 快速透明的 ORM。
  5. 出色且快速的 DB 操作,例如您可以在一秒钟内插入 1000 条记录,这比正常的 DB 操作快 10 倍。
  6. 这类似于旧的 VCL,并采用了新的工程设计,以实现最快的操作。
  7. 模型始终处于最新状态:已排序和已过滤。
  8. Python 应用程序服务器触发器
  9. 非常适合 MVC 项目

此外,您可以轻松完成其余工作,只需设置每个业务实体的行为,它们就会完成其余工作,换句话说,系统具有透明的 ORM,可以使您的工作立即与 RDBMS 同步,甚至在客户端验证和类型也会根据您的 RDBMS 进行更改。

请下载附件文件以获取更新,您也可以通过以下地址加入 MVC Plus 项目: http://sourceforge.net/projects/mvcplus/

它比其他可用的 ORM(如 Entity Framework 和 NHibernate)具有许多优势,它可以用于所有其他项目,但在大多数情况下,您可以利用这个经过测试且稳定的系统。

  • 内置动态策略模式支持
  • 使用行为架构而不是创建架构

与 VCL 数据组件类似的设计

支持无状态和有状态操作

模型:(其他实体框架大多使用扁平模型)

  • 多级模型
    • 2D 模型(行)
    • 3D(递归和行)
    • 多级模型
  • 合并类和视图

表达式:(示例)

  • (BirthDate>'27/1/2011 and BirthDate<'27/2/2011) or BirthPlace=='TEHRAN'
@EXPR Replace(Address,'Tehran','Greate Tehran') where BirthPlace=='TEHRAN

表达式用于

  • 过滤器。
  • 策略和规则
  • 公式字段
  • 所有可能的命令

表达式命令

规范函数[21]
聚合函数Avg, BigCount, Count, Max, Min, StDev, StDevP, Sum, Var, VarP
数学函数Abs, Ceiling, Floor, Power, Round, Truncate
字符串函数Concat, Contains, EndsWith, IndexOf, Left, Length, LTrim, Replace, Reverse, Right, RTrim, Substring, StartsWith, ToLower, ToUpper, Trim
日期和时间函数AddMicroseconds, AddMilliseconds, AddSeconds, AddMinutes, AddHours, AddNanoseconds, AddDays, AddYears, CreateDateTime, AddMonths, CreateDateTimeOffset, CreateTime, CurrentDateTime, CurrentDateTimeOffset, CurrentUtcDateTime, Day, DayOfYear, DiffNanoseconds, DiffMilliseconds, DiffMicroseconds, DiffSeconds, DiffMinutes, DiffHours, DiffDays, DiffMonths, DiffYears, GetTotalOffsetMinutes, Hour, Millisecond, Minute, Month, Second, Truncate, Year
按位函数BitWiseAnd, BitWiseNot, BitWiseOr, BitWiseXor
其他功能NewGuid

示例用法:(下面的 C# 代码)

  • Profiles.Person.Update(new { name = "@EXP name+' test'" }, "BirthPlace=='Tehran' and Age>45");
  • [FormulaField("DifferenceYears(Now,BirthDate)"]
  • public int Age{get;set;}
  • [ReadOnly("@WHERE owner!=CurrentUser"]
  • public bool Interested{get;set;}
  • Profiles.Person.Filter="Editor==ME and ";

控件和安全性

  • MetaModels(相当于视图)
  • 模型
  • Rows
  • Columns

策略支持

完全访问、只读、只写、删除

兼容

  • LINQ
  • 表达式查询请求

并与 WEBLIGHTS 集成作为默认支持的 DAL。

  • 光标(支持多级光标)
  • 延迟加载搜索
  • Sort
  • 过滤(支持复杂表达式)
  • Group By

可扩展的表达式支持,用于其余命令。

为批量操作优化

始终排序和过滤

可用的数据库场景

  • 多主/多从
    • 过滤器。
  • 一对一
  • 一对多
  • 递归
    • 自递归
    • 多对多
  • 多对多

多主/多从

image003.gif

支持的类型

  • 字符串
  • 基数
  • 浮点数
  • 货币(ECB 支持)
  • 单位(可兑换单位)
  • GUID
  • 日期时间
  • 二进制
  • 流(应用程序服务器和 RDBMS)
  • 图像
  • XML
  • 自定义(公式字段)

可用的验证器

  • 类型
  • 最大和最小
  • Range
  • Scale
  • 格式
  • 要求
  • 自定义

其他命令

  • 光标(支持多级光标)
  • 延迟加载搜索
  • Sort
  • 过滤(支持复杂表达式)
  • Group By

插入 5000 条记录的示例代码(在普通的双核 2.66 Intel 机器上大约需要 3 到 4 秒才能完成)

Try{
for (var t = 0; t < 5000; t++)
            {
                try{
    p.Person.Insert();
                p.Person.Assign(new { aname = "Ryan", aFamilyName = "Ali" }, "name=aname;
         familyname=afamilyname");
                p.Person.Name = t.ToString() + " test ";
                p.Person.FamilyName = t.ToString() + " test ";
        finally{                
            .Person.Post();
        }
            }
            p.Person.Flash();
}catch{
p.Person.Cancel();
}
TRY
Insert or Update Or Delete
Set Values  ‘p.person.Name=“ALI”;
FINALLY
    Post 
Flash
CATCH
    Cancel

XML 支持

除了 XDOM,还支持 XML DB

在模型中

Person["Name/MiddleName"];
XPATH and XQUERY Extensible Support
Device ["features/Supports"].Insert();
Device ["features/Supports/DeviceName"].Value="Data";
Device.Post();

过滤器/策略和表达式在其余 XML 支持中得到支持。

映射

image004.gif

物理 XML 映射

  • 表规范
  • 触发器:序列
  • 存储过程:序列
  • 键:序列
  • 关系:序列
  • 字段:序列

支持部署(安装)

逻辑 XML 模型映射

  • [Connection]
  • 表规范(序列)
  • Python 触发器(序列)
  • Python 存储过程(序列)
  • 键(序列)
  • 关系(序列)
  • 字段(序列)

元模型 XML 映射

  • 模型关系
  • 配置文件和策略
  • 行为
  • 组件行为

image005.gif

模型硬编码映射(模型硬编码映射)

示例元模型

WLMOAdapter(WLAdapterType.MSSQL, ConnectionString: “@INDB”)]
    [WLMOTableInfo("address;person;addresstype")]
    [WLMOCommandInfo("select","", WLCommandType.ORM, WLIOMode.Read)]
    [WLMOCommandInfo("update", "", WLCommandType.ORM, WLIOMode.Write)]
    [WLMOCommandInfo("delete", "", WLCommandType.ORM, WLIOMode.Write)]
    [WLMOCommandInfo("insert", "", WLCommandType.ORM, WLIOMode.Write)]
    public class Address : WLModel<APerson>
    {
        [WLFField(dbFieldName: "Address.Address")]
        [WLFDisplayName("ryan", Language: WLLanguages.Default)]
        public string FullAddress 
        {
            get { return (string)this["FullAddress"]; }
            set { this["FullAddress"] = value; }
        }
        [WLFField(dbFieldName:"PersonID")]
        [WLFForeignKey("Person", "PersonID")]
...

示例硬编码元模型:(下面的 C# 代码)

[WLMMDefaultProfile("Admin;@EXPR UserType=44")]
    public class metamodel : WLBaseMetaModel 
    {
        [WLMODisplay("@ADDRESS")]
        [WLMOAutoCreate]
     [WLMOConnectTo("Person”)]
        public Address Address { get; set; }
        [WLMODisplay("@PERSON")]
        [WLMOAutoCreate]
    public APerson Person { get; set; }
    }

WEB FARMS 场景

  • 所有请求都应转到同一台机器

更多

  • 每个用户大约需要 20 到 30MB
  • 可实现 ISO/IEC 27001

image006.jpg

© . All rights reserved.