我公开了一个RESTful接口,允许添加Category
和SubCategory
类型。
分类
public class Category : EntityBase<Category>
{
public string Name { get; set; }
public bool Enabled { get; set; }
public virtual ICollection<SubCategory> SubCategories { get; set; }
}
子类别
public class SubCategory : EntityBase<SubCategory>
{
public int CategoryId { get; set; }
public string Name { get; set; }
public bool Enabled { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
我的问题是,我应该将Category
对象与其关联的子项SubCategories
一起传递,然后找出孩子的新内容:
public void AddSubCategory(Category category)
{
// Figure out what object on the SubCategories collection are new (no PK value?)?
}
或者这样的方法会更好吗?:
public void AddSubCategory(int categoryId, SubCategory subCategory);
答案 0 :(得分:3)
您的第二种方法更清晰,但可能需要更长的时间来设置前端。您可以直接将子类别推送到数据库/存储中[虽然我建议您检查存储过程或实体存储库以防止同名的两个子类别]。
使用第一种方法,您需要遍历整个子类别列表,并且可能会对每个子类别进行数据库调用,或者执行一些混乱的操作,例如将整个列表提交到存储过程并在其中进行流失。
第二种方法也会扩展得更好。考虑将多少数据发送到服务器,然后随着子类别列表的增长进行重新处理。
除了传输冗余数据并且需要潜在地引起大量额外的数据库调用之外,您可能会关注那些将实现您的API的人的样式选择,我认为开发人员会期望使用单独的方法来添加,更新,删除和发现提交整个列表令人困惑。
干杯
答案 1 :(得分:1)
嗯,我认为这个问题没有明显的答案,而且归结为品味问题。
就个人而言,如果您希望一次只添加一个对象,我将使用第二种方法,因为它可以节省您迭代子类别列表,这将有利于您的应用程序的性能。你永远不知道你的应用程序将如何扩展,你最终可能需要处理很多类别。
我要做的是采取第二种方法,但由于你已经在第二种方法中有了一个CategoryId,我只想将签名更改为:
public void AddSubCategory(SubCategory subCategory);
从subCategory中提取类别ID。