0

我无法解决这个问题并且还没有找到正确的搜索键:

我想有几个categoriesitems其中items都有特定的attributes. 那些attributes(文本字段、下拉菜单或复选框)应该添加到 a 中category,我想attributes为每个item.

我正在使用 MVC 4 和代码优先 EF5。我该如何实施?

我的第一种方法是几个类Text,例如,它们是从抽象类和这样的类Dropdown继承的:AttributeCategory

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

但后来我不知道继续。我是在正确的道路上还是完全错误的?有人可以给我一些我可以搜索的提示吗?

编辑

最终,我正在尝试建立一个高保真设备列表。扬声器具有与放大器不同的属性,而扬声器具有与录音机不同的属性。我想统一查看每个设备的详细信息,并通过额外的免费文本区域为该类别预定义特定属性。Speaker XYZ is my item, Speaker mycategory和 dB an attribute

4

3 回答 3

1

好的,所以这个问题基本上是关于数据设计的。

首先,我假设规则是:

  1. 一个项目有一个类别
  2. 一个类别有很多属性
  3. 一项具有与该类别相关的许多属性

对于规则 1,它在您的设计中已经足够好了。(简化示例)

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

它足够清楚。

对于第 2 条规则,我认为您应该创建一个 CategoryAttribute 类。它持有一对多类别和属性之间的关系。基本上,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>是类别属性和项目属性之间的一对多关系。

对于规则 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 回答
1

实际上,我从未使用过代码优先方法,但我可以让您了解如何处理这种情况......对我来说,它看起来Item是主要的,而不是Category. 所以你可以有这个结构......

public class Category
{
    [Key]
    public int CategoryId { get; set; }
    public string CategoryName { get; set; }
    public string CategoryDescription { get; set; }
    // use attributes here if you want them for Category
    //public Dictionary<string, string> ItemnAttributes { get; set; }
}

public class MyItem
{
    [Key]
    public int ItemId { get; set; }
    public string ItemName { get; set; }
    public string ItemDescription { get; set; }
    public Category ItemnCatagory { get; set; }
    public Dictionary<string, string> ItemnAttributes { get; set; }
}

希望这可以帮助..

于 2013-04-11T13:13:35.257 回答
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 回答