0

我有我的數據庫中的現有表,並需要創建一個領域,它與現有的數據工作。FluentNHibernate映射到現有的表沒有規範化

我旁邊的表結構:

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類,那麼每個集合只會獲得一個屬性。但我需要我的財產每個項目在該集合。

那麼如果我不能解釋我需要什麼只要看看我的表中的示例數據。有什麼方法可以映射它嗎?

+0

do函數表示每個函數執行不同代碼的邏輯嗎?某種策略模式? – Firo

回答

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 
} 
+0

好的,我瞭解了有關組件的想法,但沒有收藏。這是什麼意思? UserMap的Id在哪裏? –

+0

我遺漏了id,因爲它不影響HasManyToMany映射。 FunctionalGroup表是一個帶有compositeIds的鏈接表,並且使用NHibernate,你不需要類。您只需要映射父鍵和子鍵的外鍵列,並且由於與父鍵的連接不使用我使用PropertyRef的主鍵/ ID。嘗試一下並告訴我們它是否有效 – Firo