3

试图让我了解实体框架。我有一个包含两个表的数据库,其中包含有关交易的信息。一个包含事务类别信息,并一对一地链接到事务表中(transactions.Category <=> Category.CategoryID)。我可以在填充了类别实体的情况下在内存中创建新事务,但是当我尝试刷新到数据库时,我得到“{”无效对象名称'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 指出的那样,复制和过去的错误!我有两个 Transaction 类型的 DbSet,而不是上面的每个 DbSet。

二确保代码理解一对多或一类对多事务的连接,我必须在类别模型上添加事务的 ICollection。

在事务选项上,无处存储类别模型的外键。我添加了一个 Guid (CategoryID) 来存储它。

EF 试图在 Transactions 表中找到一个名为 Category_CategoryID 的 Column 来存储相应 Category 条目的外键。因为我使用了一个已经存在的数据库,所以我不得不使用数据注释来设置 CategoryID 字段的列。

我必须做 CategoryID Guid?或可为空的。否则,所有没有类别的事务都会尝试使用 GUID = 000-000 将类别添加到数据库中...... Witch 给了我一个主键约束错误。

是的,我知道类别拼写错误......自高中以来就犯了同样的错误。

你们提供给我的信息让我对 EF 有了更好的理解,所以我可以用谷歌搜索到正确的词。在这里找到了一个用户的博客系列,它真的帮助我进入了它!- 感谢Morteza Manavi的大力投入!

于 2012-07-15T07:37:24.197 回答
0

每个上下文只知道一个实体。所以如果你这样做

transaction.Category = category;

并尝试通过TransactionDBContext它来实现这一点,很明显它应该抱怨。

上下文(实际上是查询提供程序)尝试将您的代码转换为 SQL,因此它需要类别的映射信息,但这是在另一个上下文中。

我假设您有理由使用两个上下文,但是在一个上下文中映射两个实体会更容易。如果您需要保留两个上下文,您可以从中获取 categoryIdCategoryDBContext并通过该值设置 Transaction.CategoryDBContext。这可以提交,TransactionDBContext因为现在您正在处理原始属性。


编辑
在一种情况下定义为:

public class TransactionDBContext : DbContext
{
    public DbSet<Transaction> Transactions { get; set; }
    public DbSet<Category> Categorys { get; set; }
}
于 2012-07-10T20:31:15.730 回答