4

既存のデータベースを使用していて、asp.net MVC4に更新しようとしています。2つのテーブルのモデルを理解するのに苦労しています。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

RuleApplyタイプにキープロパティを追加するだけです(Id慣例によりキーとして扱われます。そのような名前のプロパティを)でマークする必要はありませんKeyAttribute)。また、属性を使用してプロパティを次のForeignKeyようにリンクします。rule_idRule

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 はテーブルの更新をためらうと思います。あるレコードと別のレコードを区別する方法がわかりません。

ただし、基礎となるデータベースでそうしなくても 、type_idrule_idが の主キーであることを EF で示すことができます。RuleApply

于 2013-03-12T10:58:56.097 に答える