实体框架和业务对象

Posted

技术标签:

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

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

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

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

另外这比 LinqToSql 有什么优势?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于实体框架和业务对象的主要内容,如果未能解决你的问题,请参考以下文章

ORM框架简介

django框架之模型

在单独的数据访问和业务逻辑层中,我可以在业务层中使用实体框架类吗?

在紧凑框架上映射对象

调试实体框架 DBContext API 映射

即使指定了精度,实体框架验证警告:XAF 日志