0

我的应用程序为每个聚合根存在一个存储库,但有时需要从此聚合根中只删除一个子实体。我如何使用存储库模式来做到这一点?删除存储库中的子实体

例:

 
Brand (Aggregate Root) 
|_ CarModels (Collection of CarModel)

我需要从品牌B拆下CarModel A,但我只有BrandRepository。那么我怎么能做到这一点?

我不知道如果我的代码,会帮助你,但在这里它是:

public class Brand 
{ 
public int Id {get;set;} 
public string Name {get;set;} 
public virtual ICollection<CarModel> Models {get;set;} 
} 

public class CarModel 
{ 
public int id {get;set;} 
public string Name {get;set;} 
} 

public class BrandRepository 
{ 
/// .... 

public void Save(Brand entity) 
{ 
this.context.Brands.AddOrUpdate(entity); 
this.context.SaveChanges(); 
} 

public void Delete(Brand entity) 
{ 
this.context.Brands.Remove(entity); 
this.context.SaveChanges(); 
} 
} 

一个信息被遗漏的是,我使用EF代码优先。

+1

这是具体实施的问题。所以没有代码你的问题就没有意义了。 –

+0

增加了一些更详细的问题。 –

回答

0

我会实现这个使用Identifying Relationships和你的代码的一些重构。

public class CarModel 
{ 
    [Key, Column(Order = 0), DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    [Key, ForeignKey("Brand"), Column(Order=1)] 
    public int BrandId { get; set; } 
    public Brand Brand { get; set; } 
} 

有实施库模式多种方式和我做了尽可能少的进行必要的修改,虽然我通常喜欢保存在一个层越往上的变化。

public class BrandRepository 
{ 
    private readonly Context context; 

    public BrandRepository(Context context) 
    { 
     this.context = context; 
    } 

    public void Add(Brand brand) 
    { 
     this.context.Brands.Add(brand); 
    } 

    public Brand FindByName(string name) 
    { 
     return this.context.Brands.Single(b => b.Name == name); 
    } 

    public void RemoveCarModel(Brand brand, string carModelName) 
    { 
     var carModelToRemove = brand.Models.Single(cm => cm.Name == "A car model"); 
     brand.Models.Remove(carModelToRemove); 
    } 

    public void Save() 
    { 
     context.SaveChanges(); 
    } 

添加了一个测试,添加一个品牌与两个车型,然后删除其中一个车型。

[TestMethod] 
    public void Test() 
    { 
     // Arrange. 
     using (var context = new Context()) 
     { 
      var models = new List<CarModel> { 
       new CarModel { Name = "A car model" }, 
       new CarModel { Name = "Another car model" } 
      }; 

      var brand = new Brand { Name = "A Brand", Models = models }; 

      var brandRepository = new BrandRepository(context); 
      brandRepository.Add(brand); 
      brandRepository.Save(); 
     } 

     // Act. 
     using (var context = new Context()) 
     { 
      var brandRepository = new BrandRepository(context); 
      var brand = brandRepository.FindByName("A brand"); 
      brandRepository.RemoveCarModel(brand, "A car model"); 
      brandRepository.Save(); 
     } 

     // Assert. 
     using (var context = new Context()) 
     { 
      var brandRepository = new BrandRepository(context); 
      var brand = brandRepository.FindByName("A brand"); 
      Assert.AreEqual(1, brand.Models.Count); 
      Assert.AreEqual("Another car model", brand.Models.Single().Name); 
     } 
    } 
0
Brand brand = brandRepository.find(brandId); 
brand.remove(carModelId); 
brandRepository.save(brand); 

但DDD似乎是用于显示数据矫枉过正。

+0

我的实体是POCO。他们没有任何操作,只是属性。 –

+0

@JulianoNunesSilvaOliveira那么为什么要使用DDD和存储库模式呢? – Hippoom

+0

我不明白你为什么这么问。 –