2013-03-12 71 views
4

我正在使用現有的數據庫,希望更新到asp.net MVC 4.我無法爲兩個表格創建模型。 Rule和RuleApply表。爲兩個鏈接的表創建ASP.Net MVC模型

我希望用類似這樣的東西進行查詢:

var rules = db.Rules.Include("RulesApply").Where(t => t.rule_active == 1).ToList(); 

的RuleApply表沒有主鍵(它只是作爲一個查找表) - 所以當我嘗試編譯,我得到的錯誤:

EntityType 'RuleApply' has no key defined. Define the key for this EntityType.

有什麼辦法可以將Rule.id和RuleApply.rule_id連接起來嗎?或者是現有的表,必須添加主鍵,才能使用EF/Linq等?

namespace emc.Models 
{ 
public class Rule 
{ 
    [Key] 
    public int id { get; set; } 
    public int type_id { get; set; } 
    public int rule_active { get; set; } 
    public DateTime rule_start { get; set; } 
    public DateTime rule_end { get; set; } 
    public virtual ICollection<RuleApply> RulesApply { get; set; } 
} 

public class RuleApply 
{ 
    public int type_id { get; set; } 
    public int rule_id { get; set; } 
    public virtual Rule Rule { get; set; } 

} 
} 

感謝您的任何建議,

馬克

回答

5

只是關鍵屬性添加到RuleApply型(Id將被視爲按照慣例關鍵,你不需要用這樣的名稱與標記屬性KeyAttribute)。還可以使用ForeignKey屬性rule_id財產與Rule鏈接:

public class RuleApply 
{ 
    public int Id; // entity should have primary key 
    public int type_id { get; set; } 
    public int rule_id { get; set; } 
    [ForeignKey("rule_id")] 
    public virtual Rule Rule { get; set; } 
} 

或從現有特性使複合鍵:

public class RuleApply 
{ 
    [Key, Column(Order=0)] 
    public int type_id { get; set; } 
    [Key, Column(Order=1)] 
    public int rule_id { get; set; } 
    [ForeignKey("rule_id")] 
    public virtual Rule Rule { get; set; }  
} 

BTW在C#中,我們使用PascalCase命名的屬性。

1

是否有某些原因導致您無法使type_idrule_id的組合主鍵爲RuleApply?如果這些字段被編入索引,那麼主鍵將會運行得更快。

我不是100%確定的,因爲我所有的表通常都有鍵,但是我相信如果沒有主鍵,EF會更新表。它不會知道如何告訴另一個記錄。

但是,您可以在EF中指出type_idrule_id是主鍵RuleApply,即使在底層數據庫中沒有這樣做。