Here is an example mapping:
public class User
{
public string DistinguishedName { get; set; }
public int BadPasswordCount { get; set; }
public string[] Employees { get; set; }
public string Title { get; set; }
public string PostalCode { get; set; }
public string CommonName { get; set; }
public DateTime? WhenCreated { get; set; }
public string FirstName { get; set; }
public Guid Guid { get; set; }
public string City { get; set; }
public int Version { get; set; }
public string Country { get; set; }
public DateTime? LastChanged { get; set; }
public byte[] Sid { get; set; }
public long EmployeeId { get; set; }
public string PhoneNumber { get; set; }
public string Street { get; set; }
public string Comment { get; set; }
public string Name { get; set; }
public string LastName { get; set; }
}
public class UserMapping : ClassMap<User>
{
public UserMapping()
{
NamingContext("CN=Users,CN=Employees,DC=Northwind,DC=local");
ObjectCategory("person");
Map(u => u.BadPasswordCount).Named("badpwdcount");
Map(u => u.Employees).Named("directreports");
Map(u => u.Title);
Map(u => u.PostalCode);
Map(u => u.CommonName).Named("cn");
Map(u => u.WhenCreated);
Map(u => u.FirstName).Named("givenname");
Map(u => u.Guid).Named("objectguid");
Map(u => u.City).Named("l");
Map(u => u.Version).Named("usnchanged");
Map(u => u.Country).Named("c");
Map(u => u.LastChanged).Named("whenchanged");
Map(u => u.Sid).Named("objectsid");
Map(u => u.DistinguishedName);
Map(u => u.EmployeeId);
Map(u => u.PhoneNumber).Named("telephonenumber");
Map(u => u.Street);
Map(u => u.Comment);
Map(u => u.Name);
Map(u => u.LastName).Named("sn");
}
}
I specify the object's location in the directory by using NamingContext(). I also map it to a object category, but it's not required. Mapping properties is pretty straightforward. You use a lambda expression to map a property and if it has a different name in the directory then you can specify that with Named().
It's not always necessary to create a specific mapping for your classes. The same way auto-mapping works with anonymous types, you can use the class as an example and it will map everything by convention. You have two options if you want to auto-map an existing class:
//Option 1
var user = context.Query<User>("CN=Users,CN=Employees,DC=Northwind,DC=local")
.FirstOrDefault(u => u.Name == "Alan Hatter");
//Option 2
var example = new User();
var user = context.Query(example, "CN=Users,CN=Employees,DC=Northwind,DC=local", "Person")
.FirstOrDefault(u => u.Name == "Alan Hatter");
If you try to auto-map an existing class without specifying a namingContext, you will get a MappingException. Also, remember your property names have to match the names in the directory for everything to work with auto-mapping. I'll cover finding available attributes, their types, and names in my next post. Stay tuned!
Woo Hoo! Love the code :)
ReplyDeleteHe encontrado este blog por la búsqueda de LINQ to LDAP. Esto es muy interesante y me encuentro con su código muy sorprendente. Por favor, mantenga el buen trabajo y hacer que el código mucho para todos nosotros para ver.
ReplyDeleteThanks for the support! The source code is hosted at codeplex as LINQ to LDAP. I'm hoping to have a 1.0 version ready in the next few weeks.
ReplyDelete