我正在使用现有数据库,希望更新到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; }
}
}
感谢您的任何建议,
标记
答案 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_id
和rule_id
组合成RuleApply
的主键?如果这些字段被索引,事情将会更快地运行,主键将会这样做。
我不是百分百肯定,因为我的所有表通常都有密钥,但我相信如果没有主键,EF将不愿意更新表。它不会知道如何从另一个记录中分辨出一条记录。
但是,您可以在EF中指出type_id
和rule_id
是RuleApply
的主键,即使在基础数据库中没有这样做也是如此。