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

我不明白你爲什麼這麼問。 –