【发布时间】:2013-03-13 22:05:51
【问题描述】:
我正在尝试创建一个 MVC3 应用程序,我对首先创建数据库的 EF 代码感到困扰。 我有这个表:用户、类别、产品、贷款。 用户可以创建一个或多个类别。 用户可以添加一个或多个产品。 一个用户可以添加一个或多个贷款。 一个类别可以有一个或多个产品。 一个类别属于一个用户。 一个产品可以没有或有更多的贷款。 一个产品属于一个用户。 产品位于类别中。 贷款属于用户。 贷款被添加到产品中。
public class User
{
public int UserID { get; set; }
public string UserName { get; set; }
public virtual ICollection<Category> Categorys { get; set; }
public virtual ICollection<Product> Products { get; set; }
public virtual ICollection<Loan> Loans { get; set; }
}
public class Category
{
public int CategoryID { get; set; }
public string CategoryName { get; set; }
public int UserID { get; set; }
public virtual User User { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
public class Product
{
public int ProductID { get; set; }
public string ProductName { get; set; }
public int UserID { get; set; }
public int CategoryID { get; set; }
public virtual User User { get; set; }
public virtual Category Category { get; set; }
public virtual ICollection<Loan> Loans { get; set; }
}
public class Loan
{
public int LoanID { get; set; }
public bool LoanStatus { get; set; }
public int UserID { get; set; }
public int ProductID { get; set; }
public virtual User User { get; set; }
public virtual Product Product { get; set; }
}
已经制作了上下文:
public class BuisnessContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Category> Categorys { get; set; }
public DbSet<Product> Products { get; set; }
public DbSet<Loan> Loans { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
已添加连接字符串:
<add name="BuisnessContext"
connectionString="Data Source=|DataDirectory|Buisness.sdf"
providerName="System.Data.SqlServerCe.4.0"/>
还做了一个简单的Initializer类:
public class BuisnessInitializer : DropCreateDatabaseIfModelChanges<BuisnessContext>
{
protected override void Seed(BuisnessContext context)
{
var users = new List<User>
{
new User { UserName = "u1"},
new User { UserName = "u2"} };
users.ForEach(s => context.Users.Add(s));
context.SaveChanges();
var categories = new List<Category>
{
new Category { CategoryName = "N1", UserID=1 } };
categories.ForEach(s => context.Categorys.Add(s));
context.SaveChanges();
var products = new List<Product>
{
new Product { ProductName = "N1", UserID = 1, CategoryID = 1 }
};
products.ForEach(s => context.Products.Add(s));
context.SaveChanges();
var loans = new List<Loan>
{
new Loan { LoanStatus = true, UserID = 2, ProductID = 1 }
};
loans.ForEach(s => context.Loans.Add(s));
context.SaveChanges();
}
}
我还为用户生成了一个控制器来获取用户,但是当我尝试获取用户时,我收到了如下错误:
无法检查模型兼容性,因为模型中未包含 EdmMetadata 类型。确保已将 IncludeMetadataConvention 添加到 DbModelBuilder 约定中。
我试图改变Database.SetInitializer<BuisnessContext>(new BuisnessInitializer());
Database.SetInitializer<BuisnessContext>(null);
然后我收到表用户不存在的错误,我在我的 APP_DATA 文件夹中没有找到任何表 -> Buisness.mdf 数据库已创建,但还有任何表。
我知道在我的 BuisnessContext 中我必须为一对多或类似的东西放一些代码,但我不知道该怎么做。
请帮忙!
【问题讨论】:
-
我认为这不是我遇到的问题。我发现与 DB 存在混淆,因为我有从用户到更多类别的关系,从类别到更多产品以及用户与更多产品的关系,这是一个循环,我不能做其他方式。所以我只是删除了循环关系,它可以工作。如何为我需要的关系工作?
-
我找到的对我来说最好的答案是:stackoverflow.com/questions/7367339/…
标签: asp.net-mvc-3 entity-framework fluent-interface