10

I have never used the entity framework before and i would like to try some personal projects implementing it to get my feet wet.

I see that entities can be exposed to the presentation layer. But i don't want certain fields exposed, fields like modified dates and created dates and various other database fields.

how could i implement Business objects and just expose the properties i need but still keep the objects serializable?

Also what advantages does this have over LinqToSql?

Jean-Pierre Matsumoto
  • 1,917
  • 1
  • 18
  • 26
BastanteCaro
  • 1,269
  • 1
  • 13
  • 24

4 Answers4

22

When you define an entity in the EDMX model you can specify the visibility of each property's setter and getter, so if you don't want the ModifiedDate to be visible in other layers, you can simply specify it as internal.

enter image description here

If your requirements are more complicated like the ModifiedDate should be accessible in the entities assembly and the business logic assembly but not in the UI assembly, then you need to create another object which will be exchanged between the business logic and the UI logic layers.

Moe Howard
  • 157
  • 9
Ladislav Mrnka
  • 360,892
  • 59
  • 660
  • 670
  • @Robert: What kind of sample do you expect? – Ladislav Mrnka Mar 05 '11 at 18:47
  • How do you specify the visibility of each property's getter and setter? – Robert Harvey Mar 05 '11 at 22:00
  • 1
    @Robert: I hope that picture is self descriptive. – Ladislav Mrnka Mar 05 '11 at 22:27
  • thats a lot of work to explain it, thanks very much. i like the idea. i guess its a lot of work to set all these but still a lot less than writing bll for eash entity. – BastanteCaro Mar 05 '11 at 23:09
  • How to add validation to entity properties ? Is it possible to separate this validations in another project ? – Xaqron Mar 06 '11 at 02:46
  • @Xaqron: It is possible to add validation in another part of partial class via `MetadataType`:http://stackoverflow.com/questions/5128303/how-to-add-validation-to-my-pocotemplate-classes/5128373#5128373 Metadata class can be probably defined in other project. – Ladislav Mrnka Mar 06 '11 at 09:12
  • @Ladislav: How can I define part of a partial class in another project ? (I've tried but it seems partial class files should be in the same project) – Xaqron Mar 06 '11 at 09:48
  • @Xaqron: You can't define partial class in another project - you can only define class referenced in `MetadataTypeAttribute` in another project. – Ladislav Mrnka Mar 06 '11 at 09:56
3

Personally use a wrapper class over entity and expose or shadow what I need.

// 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; }
}
Xaqron
  • 29,931
  • 42
  • 140
  • 205
  • 1
    this sounds like what i was looking for. this can be serialised easily? – BastanteCaro Mar 05 '11 at 23:06
  • Yes, just mark your `BLL` class as `serializable` and follow the rules. I was thinking about this solution a while and this was working for me. I prefer this because you can declare it in a stand-alone project and don't add any `partial class` to entity project (in my case two different teams were working on each project). There are a few tricks about this solution like creating two constructors, one parameter-less and another accepting an entity object... – Xaqron Mar 06 '11 at 02:43
1

You only bind the properties you want to the presentation layer, this can be done through declaration, a Business Logic layer (with it's own level of object abstraction) or your ViewModel.

Lazarus
  • 41,906
  • 4
  • 43
  • 54
1
      // this is your edmx
        Asset5Entities conx = new Asset5Entities();

// consider this is a new object list of Contact that is a table in the database //using entity framework this database table is mapped to an object for u to handle

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

//using a big of LINQ u can now select or query over any table in ur database and u have // access to the columns in that table example (Email) here

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

// rather than

        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
N Jay
  • 1,774
  • 1
  • 17
  • 36