2012-07-10 21 views
3

試圖讓我的頭繞着實體框架。我有一個包含兩個包含交易信息的表的數據庫。一個包含交易類別信息,並且1對1鏈接到交易表(交易類別< => Category.CategoryID)。我可以在充滿類別的實體內存中創建新的事務,但是當我嘗試刷新到DB我得到「{」無效的對象名稱mEconomyUser.category'。「}」.Net實體框架中的嵌套模型

交易表:

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; } 
    } 
} 

任何sugges蒸發散?

+0

實際上你的數據庫中是否有一個名爲mEconomyUser的模式,並且它們是這些表的成員?如果你有一個'FROM mEconomyUser.category',但你的表實際上是dbo.category,那麼你會遇到問題。 – JamieSee 2012-07-10 15:28:46

+0

模式名爲mEconomy。這是由於共享主機環境,我的ISP爲每個用戶設置架構。 – 2012-07-11 06:05:25

回答

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快速破解了我所遇到的問題。

As GertArnold指出,複製&過去的錯誤!我有兩個交易類型的DbSets,而不是像上面那樣。

兩個確保代碼瞭解一對多或一個類到多個事務的連接,我必須在類別模型上添加事務的ICollection。

在那裏無處存儲categoy模型的外鍵的交易選項。我添加了一個Guid(CategoryID)來存儲它。

EF試圖在Transactions表中找到一個名爲Category_CategoryID的列來存儲相應類別條目的外鍵。由於我使用的數據庫已經存在,所以我不得不使用數據註釋來爲CategoryID字段設置Column。我不得不做CategoryID Guid?或可以爲空。否則,所有沒有分類的交易都會嘗試在GUID = 000-000 ....的數據庫中添加一個類別。女巫給了我一個主鍵約束錯誤。

是的,我知道類別是拼寫錯誤...高中畢業以後犯了同樣的錯誤。

你們提供給我的信息讓我對EF有了更好的理解,所以我能夠Google正確的單詞。在這裏發現了一個blog series,這真的幫助我進入! - 非常感謝Morteza Manavi

0

每個上下文只知道一個實體。所以,如果你

transaction.Category = category; 

,並嘗試通過TransactionDBContext顯而易見的是,它應該抱怨提交此。

上下文(以及實際上是查詢提供程序)試圖將您的代碼轉換爲SQL,因此它需要類別的映射信息,但那是在其他上下文中。

我假設你有一個理由使用兩個上下文,但在一個上下文中映射兩個實體會更容易。如果您需要堅持兩種情況,您可以從CategoryDBContext獲得一個categoryId,並通過該值設置Transaction.CategoryDBContext。這可以由TransactionDBContext承諾,因爲現在你正在處理原始屬性。


編輯
在一個上下文定義是:

public class TransactionDBContext : DbContext 
{ 
    public DbSet<Transaction> Transactions { get; set; } 
    public DbSet<Category> Categorys { get; set; } 
} 
+0

謝謝你的回答! 我真的沒有理由保持上下文分離,我只是用「舊」db方法,兩個表=兩個上下文去了一個。我怎樣才能使他們兩個的背景? – 2012-07-11 05:54:49

+0

只需將您的dbset'Categorys'(類別)傳輸到第一個上下文。這是常規方法:除非有充分的理由來分割上下文,否則所有人都可以使用上下文。 – 2012-07-11 06:53:52

+0

我不確定「運輸到第一個環境」是什麼意思。我應該在同一個模型中定義它們嗎? – 2012-07-12 17:11:15