4

我正在使用现有数据库,希望更新到 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; }

}
}

感谢您的任何建议,

标记

4

2 回答 2

5

只需将 key 属性添加到RuleApplytype (Id将按约定视为 Key,您不需要使用 标记具有此类名称的属性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# 中,我们使用 PascalCase 命名属性。

于 2013-03-12T10:54:44.420 回答
1

是否有某些原因您不能组合type_idrule_id的主键RuleApply?如果这些字段被索引,事情会运行得更快,主键会这样做。

我不能 100% 确定,因为我所有的表通常都有键,但我相信如果 EF 没有主键,它会拒绝更新表。它不知道如何区分一张唱片和另一张唱片。

但是,您可以在 EF 中指出type_id并且rule_id是主键,RuleApply即使没有在基础数据库中这样做。

于 2013-03-12T10:58:56.097 回答