2013-03-12 74 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,即使在底层数据库中没有这样做。