3

EntityFrameworkに頭を悩ませようとしています。トランザクションに関する情報を含む2つのテーブルを持つデータベースがあります。1つはトランザクションカテゴリ情報を含み、トランザクションテーブル(transactions.Category <=> Category.CategoryID)に1対1でリンクされています。カテゴリエンティティが入力された状態でメモリ内に新しいトランザクションを作成できますが、DBにフラッシュしようとすると、「{"無効なオブジェクト名'mEconomyUser.category'。"}」が表示されます。

トランザクションテーブル:

TransactionID   uniqueidentifier
UserID      uniqueidentifier
Date        date
Text        nvarchar(250)
Category    uniqueidentifier
Amount      decimal(18, 0)

カテゴリ表:

CategoryID  uniqueidentifier
UserID      uniqueidentifier
Text        nvarchar(50)

これが私のモデルです:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;

namespace mEconomy.Models
{
    [Table("transactions", Schema = "mEconomyUser")]
    public class Transaction
    {
        [Key]
        public Guid TransactionID { get; set; }
        public Guid UserID { get; set; }
        public DateTime Date { get; set; }
        public string Text { get; set; }
        public virtual Category Category { get; set; }
        public decimal Amount { get; set; }
    }


    public class TransactionDBContext : DbContext
    {

        public DbSet<Transaction> Transactions { get; set; }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;

namespace mEconomy.Models
{
    [Table("category", Schema = "mEconomyUser")]
    public class Category
    {
        [Key]
        [ForeignKey("Transaction")]
        public Guid CategoryID { get; set; }
        public Guid UserID { get; set; }
        public String Text { get; set; }

        public virtual Transaction Transaction { get; set; }
    }

    public class CategoryDBContext : DbContext
    {

        public DbSet<Transaction> Categorys { get; set; }
    }
}

助言がありますか?

4

2 に答える 2

2

正しい方向に私を押してくれてありがとう!私は自分のコードですべての問題を分類しました。少し恥ずかしいですが、これがEFとの最初の出会いでした。だから、これは私が最終的に得たものです:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;

namespace mEconomy.Models
{
    [Table("Transactions", Schema = "mEconomyUser")]
    public class Transaction
    {
        [Key] // Define primary-key
        public Guid TransactionID { get; set; }
        public Guid UserID { get; set; }
        public DateTime Date { get; set; }
        public string Text { get; set; }
        public decimal Amount { get; set; }

        [Column("Category")] // Column name of the database foreign key is named Category, want to use that name for the Model
        public Guid? CategoryID { get; set; } // Property to store the foreign key for the Category
        [ForeignKey("CategoryID")] // Define property that holds the foreign key for the category model/object
        public virtual Category Category { get; set; }
    }

    [Table("Categorys", Schema = "mEconomyUser")]
    public class Category
    {
        [Key] // Define primay-key
        public Guid CategoryID { get; set; }
        public Guid UserID { get; set; }
        public String Text { get; set; }

        public virtual ICollection<Transaction> Transactions { get; set; }
    }

    public class TransactionDBContext : DbContext
    {

        public DbSet<Transaction> Transactions { get; set; }
        public DbSet<Category> Categorys { get; set; }
    }
}

Okej 私が抱えていた問題の簡単な概要。

GertArnoldが指摘したように、コピー&ペーストエラー!上記のようにそれぞれ 1 つではなく、タイプが Transaction の 2 つの DbSet がありました。

2 つは、Category モデルにトランザクションの ICollection を追加する必要があった 1 対多、または 1 カテゴリ対多トランザクションの接続をコードが理解できるようにすることです。

トランザクション オプションでは、categoy モデルの外部キーを格納する場所がありません。それを格納する Guid (CategoryID) を追加しました。

EF は、対応するカテゴリ エントリの外部キーを格納するために、トランザクション テーブルで Category_CategoryID という名前の列を見つけようとしました。既に存在するデータベースを使用したため、データ注釈を使用して、CategoryID フィールドの列を設定する必要がありました。

CategoryID Guid を実行する必要がありましたか? またはヌル許容。そうしないと、カテゴリを持たないすべてのトランザクションが、GUID = 000-000 でデータベースにカテゴリを追加しようとします.... ウィッチは主キー制約エラーを出しました。

はい、カテゴリのスペルが間違っていることは知っています... 高校時代から同じ間違いをしました。

皆さんから提供された情報により、EF の理解が深まり、適切な言葉を Google で検索することができました。ここのユーザーからのブログシリーズを見つけて、私がそれに入るのを本当に助けてくれました! - Morteza Manavi さん、素晴らしい意見をありがとうございます。

于 2012-07-15T07:37:24.197 に答える