我正在尝试创建一个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>();
}
}
添加了connectionString:
<add name="BuisnessContext"
connectionString="Data Source=|DataDirectory|Buisness.sdf"
providerName="System.Data.SqlServerCe.4.0"/>
还有一个简单的初始化程序类:
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());
whith Database.SetInitializer<BuisnessContext>(null);
然后我发现表User没有存在的错误,我在APP_DATA文件夹中找不到任何表 - &gt; Buisness.mdf 数据库已创建,但有任何表格。
我明白在我的BuisnessContext中我必须为One to many或类似的东西放一些代码,但我不知道该怎么做。
请帮忙!
答案 0 :(得分:0)
我在.net mvc cyclical reference issue with entity
找到了我的问题的答案所以我的答案是这样的:
modelBuilder.Entity<Product>()
.HasRequired(p => p.User).WithMany(p => p.Products).HasForeignKey(p => p.UserID).WillCascadeOnDelete(false);
modelBuilder.Entity<Product>()
.HasRequired(p => p.Category).WithMany(p => p.Products).HasForeignKey(p => p.CategoryID).WillCascadeOnDelete(false);
modelBuilder.Entity<Loan>()
.HasRequired(l => l.Product).WithMany(l => l.Loans).HasForeignKey(l => l.ProductID).WillCascadeOnDelete(false);
原因是我在这里为同一个表制作了一些不同的路径,如用户 - 类别,用户 - 类别 - 产品,类别 - 产品,用户 - 产品 - 贷款。
也许这对其他人来说是一个很好的答案。