ASP.Net MVC错误为2个链接表创建模型

时间:2013-03-12 10:50:32

标签: c# asp.net-mvc linq entity-framework

我正在使用现有数据库,希望更新到asp.net MVC 4.我很难为两个表创建模型。 Rule和RuleApply表。

我希望使用类似的东西来查询它:

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

RuleApply表没有主键(它只是用作查找表) - 所以当我尝试编译时,我收到错误:

  

EntityType“RuleApply”没有定义键。定义此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; }

}
}

感谢您的任何建议,

标记

2 个答案:

答案 0 :(得分: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; }    
}
C#中的

BTW 我们使用PascalCase命名属性。

答案 1 :(得分:1)

是否有一些原因导致您无法将type_idrule_id组合成RuleApply的主键?如果这些字段被索引,事情将会更快地运行,主键将会这样做。

我不是百分百肯定,因为我的所有表通常都有密钥,但我相信如果没有主键,EF将不愿意更新表。它不会知道如何从另一个记录中分辨出一条记录。

但是,您可以在EF中指出type_idrule_idRuleApply的主键,即使在基础数据库中没有这样做也是如此。