0

MVC3アプリを作ろうと思っているのですが、まずDBを作るEFコードで困っています。私はこのテーブルを持っています:ユーザー、カテゴリ、製品、ローン。ユーザーはカテゴリを作成できません。ユーザーは製品を追加できません。ユーザーはローンを追加できません。カテゴリには、1 つ以上の製品を含めることができます。カテゴリはユーザーに属します。Product は、0 またはそれ以上の Loans を持つことができます。製品はユーザーに属します。製品はカテゴリにあります。ローンはユーザーに属します。ローンが製品に追加されます。

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"/>

また、単純な 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に、1対多またはこのようなコードを配置する必要があることは理解していますが、その方法がわかりません。

助けてください!

4

1 に答える 1

0

エンティティに関する.net mvcの循環参照の問題に関する私の質問に対する答えを見つけました

したがって、私にとっての答えは次のようになります。

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

その理由は、ここでは、ユーザー - カテゴリ、ユーザー - カテゴリ - 製品、カテゴリ - 製品、ユーザー - 製品 - ローンなどの同じテーブルに対して別のパスを作成しているためです。

多分それは他の人にとって良い答えになるでしょう。

于 2013-03-24T16:47:14.750 に答える