0

私はこの問題に頭を悩ませることができず、正しい検索キーをまだ見つけていません:

すべてが特定categoriesの. それら(テキスト フィールド、ドロップダウン、またはチェックボックス) を に追加する必要があり、それらを編集して保存したいと思います。itemsitemsattributesattributescategoryattributesitem

私は MVC 4 とコードファースト EF5 を使用しています。どうすればこれを実装できますか?

私の最初のアプローチは、抽象クラスから継承された のようないくつかのクラスとText、次のようなクラスでした。DropdownAttributeCategory

public class Category
{
    [Key]
    public int CategoryId { get; set; }

    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ICollection<Item> Items { get; set; }
    public virtual ICollection<Attribute> Attributes { get; set; } 
}

しかし、それから私は続行する考えがありませんでした。私は正しい道を進んでいますか、それとも完全に間違っていますか? 検索できるヒントを教えてください。

編集

最終的には、ハイファイ デバイスのリストを作成しようとしています。スピーカーはアンプとは属性が異なり、テープレコーダーとは属性が異なります。各デバイスの詳細に統一された外観を提供し、そのカテゴリに特定の属性を事前に定義して、自由に使用できるテキスト領域を追加したいと考えています。スピーカー XYZ は my item、スピーカー my category、dB anattributeです。

4

3 に答える 3

1

このようなものはあなたのために働くかもしれないと思います...

public class Category
{
    public int CategoryId { get; set; }

    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ICollection<Item> Items { get; set; }
    public virtual ICollection<Attribute> Attributes { get; set; }
}

public class Item
{
    public int ItemId { get; set; }

    public string Name { get; set; }
    public string Description { get; set; }

    public int CategoryId { get; set; }
    public Category Category { get; set; }
    public virtual ICollection<ItemAttribute> ItemAttributes { get; set; }
}

public class Attribute
{
    public int AttributeId { get; set; }

    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ICollection<Category> Categories { get; set; }
    public virtual ICollection<ItemAttribute> ItemAttributes { get; set; }
}

public class ItemAttribute
{
    public int ItemId { get; set; }
    public int AttributeId { get; set; }

    public Item Item { get; set; }
    public Attribute Attribute { get; set; }

    public string Value { get; set; }
    public int ValueInt{ get; set; }
    // etc. 
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<ItemAttribute>()
        .HasKey(x => new { x.ItemId, x.AttributeId });
    modelBuilder.Entity<ItemAttribute>()
        .HasRequired(x => x.Item)
        .WithMany(x => x.ItemAttributes)
        .HasForeignKey(x => x.ItemId)
        .WillCascadeOnDelete(false);
    modelBuilder.Entity<ItemAttribute>()
        .HasRequired(x => x.Attribute)
        .WithMany(x => x.ItemAttributes)
        .HasForeignKey(x => x.AttributeId)
        .WillCascadeOnDelete(false);
    // AttributeCategories is created for you - but you can do the same as ^ above to customize
    // just change 'ICollection<Category> Categories' to collection of 'ItemAttribute'
}

// use it like e.g.
var item = new Item { Name = "ItemTest", };
var attribute = new Attribute { Name = "attributeTest", };
item.ItemAttributes = new List<ItemAttribute> 
{
    new ItemAttribute { Item = item, Attribute = attribute, Value = "test", },
};
var category = new Category
{
    Name = "cat1",
    Items = new[]
    {
        item,
        new Item{ Name = "Item1", },
        new Item{ Name = "Item2", },
        new Item{ Name = "Item3", },
        new Item{ Name = "Item4", },
        new Item{ Name = "Item5", },
    },
    Attributes = new[]
    {
        attribute,
        new Attribute{ Name = "att1", },
        new Attribute{ Name = "att2", },
    }
};
db.Categories.Add(category);
db.SaveChanges();
var categories = db.Categories.ToList();

ItemAttributeを接続して保存するために使用されvaluesます。

また、要件に応じてさらに調整する必要があります。

于 2013-04-11T16:22:49.387 に答える
1

わかりましたので、この質問は基本的にデータ設計に関するものです。

まず、ルールは次のとおりであると仮定します。

  1. 1 つのアイテムには 1 つのカテゴリがあります
  2. 1 つのカテゴリには多くの属性があります
  3. 1 つのアイテムには、カテゴリに関連付けられた多くの属性があります

ルール 1 については、この設計で十分です。(簡略化した例)

public class Category{
  public IEnumerable<Item> Items{get;set;}
}
public class Item{
  public Category Category{get;set;}
}

その十分に明確です。

ルール 2 については、CategoryAttribute クラスを作成する必要があると思います。1 対多のカテゴリと属性の関係を保持します。基本的に、CategoryAttribute はマスターですが、子は ItemAttribute になります。

public class Category{
  public IEnumerable<CategoryAttribute> CategoryAttributes{get;set;}
}
public class CategoryAttribute{
  public Category Category{get;set;}
  public string CategoryName{get;set;}
  public string DefaultValue{get;set;} // maybe a default value for specific 
                                       // attribute, but it's up to you

  public IEnumerable<ItemAttribute> ItemAttributes{get;set;}
}

これIEnumerable<ItemAttribute>は、カテゴリ属性とアイテム属性の間の 1 対多の関係です。

ルール 3 の場合、ルール 2 で説明した ItemAttribute は、各アイテムが所有する属性を表します。

public class Item{
  public IEnumerable<ItemAttribute> ItemAttributes{get;set;}
}
public class ItemAttribute{
  public Item Item {get;set;} // it owned by one attribute
  public CategoryAttribute{get;set;} // it owned by one category attribute
}

最初にコードで関係または主キーと外部キーを表す方法についてはよくわかりません。必要に応じて(そして可能であれば)回答を強化できることを願っています。しかし、願わくは各オブジェクトの関係とクラス設計についての私のイラストです。

于 2013-04-11T13:53:54.553 に答える