• 我想组建新的Entity框架


        这个想法已经有很长一段时间了,并且目前已经有一个雏形的版本了,我暂定它为Fireasy.Data.Entity。

        我先说一说我的想法,实体的映射将采用依赖属性的方式进行定义,这样可以避免使用反射进行实体的初始化,而且也比较实现其他代码的切入。

        在这个框架里,还是提供了引用实体和实体集的概念,它们也可以通过lazy加载进来,另外,还设计一个支持枚举的属性和一个同步属性。

        另外,根据实际项目的需要,还会将同一个实体根据不同的规则映射多个不同的数据表,以提供数据分布式和隔离式存储。还会提供一个树结构的映射及相应的持久化类,以达到快速应用。

        实体的继承特性将在下一期进行考虑。

        以下是实体类的代码示例:

        [EntityMapping("PRODUCTS")]
        public class Product : EntityObject
        {
            public readonly static IProperty _ProductId = PropertyUnity.RegisterProperty("ProductId"
                typeof(int), typeof(Product), 
                new PropertyMapInfo
                {
                    FieldName = "PRODUCTID",
                    GenerateType = IdentityGenerateType.AutoIncrement,
                    IsPrimaryKey = true,
                    IsNullable = false
                });

            public readonly static IProperty _ProductName = PropertyUnity.RegisterProperty("ProductName"
                typeof(string), typeof(Product), 
                new PropertyMapInfo
                {
                    FieldName = "PRODUCTNAME",
                    IsNullable = false
                });

            public readonly static IProperty _SupplierID = PropertyUnity.RegisterProperty("SupplierID"
                typeof(int?), typeof(Product), 
                new PropertyMapInfo { FieldName = "SUPPLIERID" });

            public readonly static IProperty _CategoryID = PropertyUnity.RegisterProperty("CategoryID"
                typeof(int?), typeof(Product), 
                new PropertyMapInfo { FieldName = "CATEGORYID" });

            public readonly static IProperty _QuantityPerUnit = PropertyUnity.RegisterProperty("QuantityPerUnit"
                typeof(string), typeof(Product), 
                new PropertyMapInfo { FieldName = "QUANTITYPERUNIT" });

            public readonly static IProperty _UnitPrice = PropertyUnity.RegisterProperty("UnitPrice"
                typeof(decimal?), typeof(Product), 
                new PropertyMapInfo { FieldName = "UNITPRICE" });

            public readonly static IProperty _UnitsInStock = PropertyUnity.RegisterProperty("UnitsInStock"
                typeof(short?), typeof(Product), 
                new PropertyMapInfo { FieldName = "UNITSINSTOCK" });

            public readonly static IProperty _UnitsOnOrder = PropertyUnity.RegisterProperty("UnitsOnOrder"
                typeof(short?), typeof(Product), 
                new PropertyMapInfo { FieldName = "REORDERLEVEL" });

            public readonly static IProperty _ReorderLevel = PropertyUnity.RegisterProperty("ReorderLevel"
                typeof(short?), typeof(Product), 
                new PropertyMapInfo { FieldName = "REORDERLEVEL" });

            public readonly static IProperty _Discontinued = PropertyUnity.RegisterProperty("Discontinued"
                typeof(bool?), typeof(Product),
                new PropertyMapInfo { FieldName = "DISCONTINUED", DefaultValue = true });

            public readonly static IProperty _OrderDetails = PropertyUnity.RegisterSpecialProperty("OrderDetails"
                typeof(EntitySet<OrderDetails>), typeof(Product));

            public readonly static IProperty _DelFlag = PropertyUnity.RegisterProperty("DelFlag"
                typeof(bool?), typeof(Product), new PropertyMapInfo { FieldName = "DEL_FLAG", IsFakeDeleteFlag = true });

            public int ProductId
            {
                get { return (int)GetValue(_ProductId); }
                set { SetValue(_ProductId, value); }
            }

            public string ProductName
            {
                get { return (string)GetValue(_ProductName); }
                set { SetValue(_ProductName, value); }
            }

            public int? SupplierID
            {
                get { return (int)GetValue(_SupplierID); }
                set { SetValue(_SupplierID, value); }
            }

            public int? CategoryID
            {
                get { return (int)GetValue(_CategoryID); }
                set { SetValue(_CategoryID, value); }
            }

            public string QuantityPerUnit
            {
                get { return (string)GetValue(_QuantityPerUnit); }
                set { SetValue(_QuantityPerUnit, value); }
            }

            public decimal? UnitPrice
            {
                get { return (decimal)GetValue(_UnitPrice); }
                set { SetValue(_UnitPrice, value); }
            }

            public short? UnitsInStock
            {
                get { return (Int16)GetValue(_UnitsInStock); }
                set { SetValue(_UnitsInStock, value); }
            }

            public short? UnitsOnOrder
            {
                get { return (Int16)GetValue(_UnitsOnOrder); }
                set { SetValue(_UnitsOnOrder, value); }
            }

            public short? ReorderLevel
            {
                get { return (Int16)GetValue(_ReorderLevel); }
                set { SetValue(_ReorderLevel, value); }
            }

            public bool? Discontinued
            {
                get { return (bool)GetValue(_Discontinued); }
                set { SetValue(_Discontinued, value); }
            }

            public EntitySet<OrderDetails> OrderDetails
            {
                get { return (EntitySet<OrderDetails>)GetValue(_OrderDetails); }
                set { SetValue(_OrderDetails, value); }
            }

            public bool? DelFlag
            {
                get { return (bool)GetValue(_DelFlag); }
                set { SetValue(_DelFlag, value); }
            }

        }

    与EF相似地,实体间的关系采用Assembly特性进行定义:

    [assembly: Relationship("Product:OrderDetails"typeof(Product), typeof(OrderDetails), "ProductId=>ProductId")]
    [assembly: Relationship("Orders:OrderDetails"typeof(Orders), typeof(OrderDetails), "OrderID=>OrderId")]
    [assembly: Relationship("Customer:Orders"typeof(Customers), typeof(Orders), "CustomerID=>CustomerID")]

        框架也提供对Linq查询的支持,目前支持mssql、oracle、mysql和sqlite几种数据库。

        目前的测试结果显示,数据加载的速度比EF稍稍快了一点点,现在需要请大虾帮忙验证这种方式的可行性。也请有兴趣的朋友一起加入讨论,多给我提些意见。QQ群号:6406277。

  • 相关阅读:
    泛型约束 where T : class,new()
    在Navicat for MySQL中打开视图时,提示视图没有主键的问题
    转:JQuery实现下拉框的数据加载和联动
    查询每门课程最高分的学生的学号,课程号,成绩
    转:SQL子句的执行顺序
    端口映射
    服务器与个人电脑的区别
    花生壳使用指南
    如何测试本机的公网IP能否被Internet用户访问
    利用ADSL拨号上网方式如何搭建服务器
  • 原文地址:https://www.cnblogs.com/faib/p/2197174.html
Copyright © 2020-2023  润新知