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; }
}
}
谢谢你的建议,
马克只需将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_id
和rule_id
的组合作为RuleApply
的主键?如果对这些字段进行索引,运行起来会更快,而主键就是这样做的。
我不是100%确定,因为我所有的表通常都有键,但我相信EF会在更新表时犹豫,如果它没有主键。它将不知道如何区分不同的记录。
但是,您可以在EF中指出type_id
和rule_id
是RuleApply
的主键,而不必在底层数据库中这样做。