0

次のドメインオブジェクトがあります。

public class UserSpecialization : PersonSpecialization, IUserSpecialization
{
    public static readonly string SpecializationNameValue = "User";

    public UserSpecialization()
    {
        Roles = new Collection<IRole>();
    }

    public virtual IEnumerable<IRole> Roles
    {
        get;
        set;
    }
}

public abstract class PersonSpecialization : DomainObjectOfInt32, IPersonSpecialization
{
    public virtual IPerson Person { get; set; }
    public virtual string SpecializationName { get; protected set; }
}

public class Person : DomainObjectOfInt32, IPerson, IAuditable
{
    public Person()
    {
        Specializations = new List<IPersonSpecialization>();
    }

    public virtual IList<IPersonSpecialization> Specializations { get; protected set; }
}

public abstract class Role : DomainObjectOfInt32, IRole, IAuditable
{
    public Role(string roleName)
        : this()
    {
        Name = roleName;
    }
    protected Role()
    {
        AssignedUsers = new Collection<IUserSpecialization>();
    }

    public virtual ICollection<IUserSpecialization> AssignedUsers
    {
        get;
        protected set; }
}

私のマッピングは次のとおりです。

public class PersonMap : ClassMap<Person>
{
    public PersonMap()
    { 
        Id(x => x.Id).GeneratedBy.Identity();
        HasMany<PersonSpecialization>(c => c.Specializations)
            .Cascade.AllDeleteOrphan();
    }
}

public class RoleMap : ClassMap<Role>
{
    public RoleMap()
    {
        Id(x => x.Id).GeneratedBy.Identity();
        HasManyToMany<UserSpecialization>(x => x.AssignedUsers).Table("UserRole");
        DiscriminateSubClassesOnColumn("Type");
    }
}

public class PersonSpecializationMap : ClassMap<PersonSpecialization>
{
    public PersonSpecializationMap()
    {
        Table("PersonSpecialization");

        Id(c => c.Id).GeneratedBy.Identity();

        DiscriminateSubClassesOnColumn<string>("SpecializationName");

        Map(x => x.SpecializationName).ReadOnly();

        References<Person>(c => c.Person);
    }
}

これで、個人を選択すると、役割コレクションで彼のすべての役割も取得します。また、役割を保存すると、リンクされているすべての個人が適切に保存されます。しかし、個人を保存すると、その個人のリンクされた役割は保存されません。

この問題を解決するにはどうすればよいですか?

UserSpecializationのマッピング:

public class UserSpecializationMap : SubclassMap<UserSpecialization>
{
   public UserSpecializationMap()
    {
        Table("User");

        DiscriminatorValue(UserSpecialization.SpecializationNameValue);

        Join("[User]", joined =>
        {
            joined.Map(c => c.UserName, "Username");

            joined.HasManyToMany<Role>(x => x.Roles).Inverse()
                .Table("UserRole");
        });
    }
}
4

1 に答える 1

0

あなたは行方不明です

public class UserSpecializationMap : SubclassMap<UserSpecialization>
{
    public UserSpecializationMap()
    {
        Table("PersonSpecialization");

        Id(c => c.Id).GeneratedBy.Identity();

        DiscriminatorValue("UserSpecialization");

        HasManyToMany(x => x.Roles).Cascade.All()...;
    }
}

ところで:私はspecializationNameに多形プロパティを使用します。その場合、プロパティを特別に初期化する必要はありません。派生クラスでそれを忘れることはできません。オブジェクト内のスペースを取りません。

// base class
public abstract string SpecializationName { get; }

// dereived class
public override string SpecializationName { get { return "User"; } }
于 2012-06-25T13:23:17.240 に答える