If you don't want to expose the ID of a domain object to the client of a WCF service, you would obviously not put an ID property in the DataContract, right? But then, when the client calls the save method on your service, how do you know it's a new object, or an existing one that was modified?
With NHibernate you can use SaveOrUpdate and it will check the Id and the unsaved-value, but when you receive the DataContract without the ID, you've no way of knowing if it's a new record to save to the database, or an existing record to update.
How would you solve this?