0

データベースに既存のテーブルがあり、既存のデータを操作するにはドメインを作成する必要があります。

私は次のテーブル構造を持っています:

Application
'ORDERSCANNER'

ApplicationFunction
'ORDERSCANNER','SCAN'
'ORDERSCANNER','READ'
'ORDERSCANNER','PRINT'

FunctionalGroup
'ADMIN','RUS','ORDERSCANNER','SCAN'
'ADMIN','RUS','ORDERSCANNER','PRINT'
'ADMIN','JAP','ORDERSCANNER','SCAN'
'ADMIN','JAP','ORDERSCANNER','PRINT'
'OPERATOR','RUS','ORDERSCANNER','SCAN'
'OPERATOR','JAP','ORDERSCANNER','SCAN'

User
'IVANOV','RUS','OPERATOR'
'PETROV','RUS','OPERATOR'
'PETROV','JAP','OPERATOR'
'SIDOROV','RUS','ADMIN - he is an ADMIN group but only for RUS. He is not able to scan for JAP

これが私のドメインの見方です

public class Application // root
{
    private readonly List<ApplicationFunction> _functions;
    public string ApplicationId { get; set; }

    public Application()
    {
        _functions = new List<ApplicationFunction>();
    }
    public void AddFunction(string newFunction)
    {
        var function = new ApplicationFunction(this, newFunction);
        _functions.Add(function);
    }
}
public class ApplicationFunction // value object
{
    public Application Application { get; private set; }
    public string FunctionId { get; private set; }

    public ApplicationFunction(Application application, string functionId)
    {
        if (application == null) throw new ArgumentNullException("application");
        if (functionId == null) throw new ArgumentNullException("functionId");
        Application = application;
        FunctionId = functionId;
    }
}
public class FunctionalGroup // root
{
    private readonly List<ApplicationFunction> _functions;
    public string GroupId { get; set; }
    public string MarketingPlanCode { get; set; }
    public IEnumerable<ApplicationFunction> Functions { get { return _functions; } }

    public FunctionalGroup()
    {
        _functions = new List<ApplicationFunction>();
    }
    public void AddFunction(ApplicationFunction applicationFunction)
    {
        _functions.Add(applicationFunction);
    }
}
public class User // root
{
    private readonly List<FunctionalGroup> _groups;
    public string UserId { get; set; }
    public IEnumerable<FunctionalGroup> Groups { get { return _groups; } }

    public User()
    {
        _groups = new List<FunctionalGroup>();
    }
    public void AddToGroup(FunctionalGroup functionalGroup)
    {
        _groups.Add(functionalGroup);
    }
}

ユーザーを見てみましょう。

public class UserMap : ClassMap<User>
{
     public UserMap()
     {
         Id(x => x.UserId).Column("USER_ID");
         HasMany(x => x.Groups).Cascade.All();
     }
}

FunctionalGroup のコレクションからマップするには追加のデータが必要なようです - それは MarketingPlanCode です。MarketingPlanCode プロパティを User クラスに追加すると、コレクションごとにプロパティが 1 つだけ取得されます。しかし、そのコレクション内のアイテムごとにプロパティが必要です。

必要なものを説明できなかった場合は、テーブルのサンプル データを見てください。マッピングする方法はありますか?

4

1 に答える 1

1

モデルはさらに単純化できると思いますが、最初にFunctionalGroupクラスを完全に捨てます。

public ApplicationFunctionMap()
{
    CompositeId()
        .KeyReference(x => x.Application, "application_id")
        .KeyProperty(x => x.FunctionId, "FunctionId");
}

public UserMap()
{
    Component(x => x.Group, c => 
    {
        c.Map(g => g.Name, "GroupId");
        c.Map(g => g.MarketingPlanCode, "MarketingPlanCode");
    })

    HasManyToMany(x => x.AllowedFunctions)
        .Table("FunctionalGroup")
        .ParentKeyColumns.Add("GroupId", "MarketingPlanCode") // in FunctionalGroup table
        .ChildKeyColumns.Add("application_id", "FunctionId") // in FunctionalGroup table
        .Propertyref(x => x.Group);   // Component defined above
}
于 2012-10-26T10:11:04.750 に答える