ASP.为两个链接表创建模型时出现MVC错误

本文关键字:模型 错误 MVC 创建 链接表 两个 ASP | 更新日期: 2023-09-27 18:03:24

我正在使用一个现有的数据库,希望更新到asp.net MVC 4。我读其中两张表的模型有困难。Rule和RuleApply表

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

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

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

EntityType 'RuleApply'没有定义键。为EntityType定义键

我能把规则链接起来吗?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; }
}
}

谢谢你的建议,

马克

ASP.为两个链接表创建模型时出现MVC错误

只需将key属性添加到RuleApply类型(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来命名属性

是否有什么原因导致不能将type_idrule_id的组合作为RuleApply的主键?如果对这些字段进行索引,运行起来会更快,而主键就是这样做的。

我不是100%确定,因为我所有的表通常都有键,但我相信EF会在更新表时犹豫,如果它没有主键。它将不知道如何区分不同的记录。

但是,您可以在EF中指出type_idrule_idRuleApply的主键,而不必在底层数据库中这样做。