【问题标题】:Entity Framework And Business Objects实体框架和业务对象
【发布时间】:2011-07-09 08:03:06
【问题描述】:

我以前从未使用过实体框架,我想尝试一些个人项目来实现它以使我的脚湿透。

我看到实体可以暴露给表示层。 但我不希望暴露某些字段,例如修改日期和创建日期等字段以及各种其他数据库字段。

如何实现业务对象并只公开我需要的属性但仍保持对象可序列化?

另外这比 LinqToSql 有什么优势?

【问题讨论】:

    标签: c# entity-framework business-logic-layer


    【解决方案1】:

    您只需将所需的属性绑定到表示层,这可以通过声明、业务逻辑层(具有自己的对象抽象级别)或您的 ViewModel 来完成。

    【讨论】:

    • 是的。我很想成为这方面的一个小例子。
    【解决方案2】:

    当您在 EDMX 模型中定义实体时,您可以指定每个属性的 setter 和 getter 的可见性,因此如果您不希望 ModifiedDate 在其他层中可见,您只需将其指定为内部即可。

    如果您的要求更复杂,例如 ModifiedDate 应该在实体程序集和业务逻辑程序集中但不能在 UI 程序集中访问,那么您需要创建另一个对象,该对象将在业务逻辑和 UI 逻辑之间交换层。

    【讨论】:

    • @Robert:你期望什么样的样本?
    • 如何指定每个属性的getter和setter的可见性?
    • @Robert:我希望这张图片是自我描述的。
    • 解释它需要做很多工作,非常感谢。我喜欢这个主意。我想设置所有这些需要做很多工作,但仍然比为 eash 实体编写 bll 少很多。
    • 如何为实体属性添加验证?是否可以在另一个项目中分离此验证?
    【解决方案3】:

    个人在实体上使用包装类并公开或隐藏我需要的内容。

    // instead of below property in your BLL:
    
    private int m_someVariable;
    
    public int SomeVariable
    {
        get { return m_someVariable; }
        set { m_someVariable = value; }
    }
    
    // You can use the entity object:
    
    private readonly EntityClass _entityObject = new EntityClass();
    
    public int SomeVariable
    {
        get { return _entityObject.SomeVariable; }
        set { _entityObject.SomeVariable = value; }
    }
    
    // or make it read-only at your BLL
    
    public int SomeVariable
    {
        get { return entityObject.SomeVariable; }
        // set { entityObject.SomeVariable = value; }
    }
    

    【讨论】:

    • 这听起来像我想要的。这个可以轻松序列化吗?
    • 是的,只需将您的BLL 类标记为serializable 并遵守规则即可。我正在考虑这个解决方案一段时间,这对我有用。我更喜欢这个,因为你可以在一个独立的项目中声明它,并且不要在实体项目中添加任何partial class(在我的例子中,每个项目都有两个不同的团队工作)。这个解决方案有一些技巧,比如创建两个构造函数,一个无参数,另一个接受实体对象...
    【解决方案4】:
          // this is your edmx
            Asset5Entities conx = new Asset5Entities();
    

    // 认为这是一个联系人的新对象列表,它是数据库中的一个表 //使用实体框架将此数据库表映射到一个对象供你处理

                List$gt;Contact$lt; s = new List$gt;Contact$lt;();
    

    //使用大量的 LINQ,你现在可以选择或查询你数据库中的任何表,你有 // 在此处访问该表示例(电子邮件)中的列

            var result = from q in conx.Contacts select q.Email;
    

    // 而不是

            string sqlcommand = "select email from Contacts";
            Contact con = new Contact();
            con.Email= "xxxx@gmail.com";
            con.FirstName="nader";
    
            //etc etc... 
    
    
    
            conx.Contacts.AddObject(con);
    
            //rather than   " insert into Contact values ......................"
    
            //having your queries within ur c# code rather than strings that are not parsed //for errors but on runtime was alot helpful for me
    

    【讨论】:

      猜你喜欢
      • 2012-08-14
      • 1970-01-01
      • 2016-04-21
      • 2013-09-14
      • 2012-03-08
      • 2010-10-10
      • 1970-01-01
      • 2013-08-31
      • 2010-11-20
      相关资源
      最近更新 更多