【问题标题】:code first database model代码优先数据库模型
【发布时间】: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&lt;BuisnessContext&gt;(new BuisnessInitializer()); Database.SetInitializer&lt;BuisnessContext&gt;(null);

然后我收到表用户不存在的错误,我在我的 APP_DATA 文件夹中没有找到任何表 -> Buisness.mdf 数据库已创建,但还有任何表。

我知道在我的 BuisnessContext 中我必须为一对多或类似的东西放一些代码,但我不知道该怎么做。

请帮忙!

【问题讨论】:

标签: asp.net-mvc-3 entity-framework fluent-interface


【解决方案1】:

我在.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);

原因是我在这里为相同的表创建了一些不同的路径,例如用户 - 类别、用户 - 类别 - 产品、类别 - 产品、用户 - 产品 - 贷款。

也许对其他人来说是一个很好的答案。

【讨论】:

    猜你喜欢
    • 2011-07-23
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 2012-12-06
    • 2018-02-26
    • 1970-01-01
    相关资源
    最近更新 更多