Ответ 1
Я думаю, что у меня есть что-то, что работает.
public class Application
{
public virtual Guid ApplicationId { get; set; }
/* Scalar Properties of an Application */
public virtual string ApplicationName { get; set; }
public virtual string Description { get; set; }
public virtual string LoweredApplicationName
{
get
{
return this.ApplicationName.ToLower();
}
set
{
if (String.IsNullOrEmpty(this.ApplicationName))
{
this.ApplicationName = value;
}
}
}
public virtual IList<Membership> TheManyMemberships { get; protected set; }
}
public class User
{
public virtual Guid Id { get; set; }
public virtual Application TheApplication { get; set; }
public virtual Membership TheMembership { get; set; }
/* Scalar Properties of a User */
public virtual string UserName { get; set; }
}
public class Membership
{
private Guid UserId { get; set; }
private User _theUser { get; set; }
protected Membership() { }
public Membership(User theUser)
{
_theUser = theUser;
}
public virtual Application TheApplication { get; set; }
/* Scalar Properties of a Membership */
public virtual string Password { get; set; }
}
public class ApplicationMap : ClassMap<Application>
{
public ApplicationMap()
{
Table("aspnet_Applications");
Id(app => app.ApplicationId).Column("ApplicationId").GeneratedBy.GuidComb();
Map(x => x.ApplicationName );
Map(x => x.LoweredApplicationName);
Map(x => x.Description );
HasMany<Membership>(x => x.TheManyMemberships)
.Inverse()
.AsBag();
}
}
public class UserMap : ClassMap<User>
{
public UserMap()
{
Table("aspnet_Users");
Id(user => user.Id).Column("UserId").GeneratedBy.GuidComb();
References(x => x.TheApplication, "ApplicationId")
.Not.Nullable();
HasOne(x => x.TheMembership)
.Cascade.All();//
//.Constrained();
Map(x => x.UserName).Not.Nullable();
}
}
public class MembershipMap : ClassMap<Membership>
{
public MembershipMap()
{
Table("aspnet_Membership");
Id(Reveal.Member<Membership>("UserId"))
.GeneratedBy.Foreign("_theUser");
HasOne(
Reveal.Member<Membership, User>("_theUser"))
.Constrained()
.ForeignKey();
References<Application>(x => x.TheApplication, "ApplicationId")
.Not.Nullable();
Map(x => x.Password);
}
}
Простите некоторые из соглашений об именах, при прототипировании я использую не-неоднозначные имена по правильному соглашению, чтобы избежать путаницы.
DDL, который у меня есть (из приведенного выше кода) и DDL из вывода asp.net(4.0) (с использованием aspnet_regsql.exe для создания DDL), кажутся последовательными (между двумя версиями).
Мне нужно поблагодарить этот пост: http://brunoreis.com/tech/fluent-nhibernate-hasone-how-implement-one-to-one-relationship/
Если вы делаете какие-либо изменения, пожалуйста, напишите их.
Но я смог сохранить приложение, пользователя и членство.
Тем не менее, я думаю, что я могу немного отойти от отношения User: Membership. Сценарий microsoft выглядит как "Имейте пользователя, но позволяйте этому пользователю иметь другой пароль для каждого приложения", что имеет смысл. Но иногда при использовании кода MembershipProvider (код MS, ничего общего с NHibernate, я "чувствую", как будто иногда он принимает одно приложение.
Я чувствую, что MS DDL должен иметь уникальное ограничение на dbo.Membership(UserId, ApplicationId), но я не вижу его в своем DDL.
Несмотря на это, это должно обеспечить некоторую пищу для размышлений.