2012-09-20 6 views
1

У меня есть 2 классов:Entity Framework 4.3: Кратность ограничение нарушается

public class FlightCostInfo : BaseEntity<Guid> 
{ 
    public Flight FlightInfo { get; set; } 
    public virtual ICollection<Cost> Costs { get; set; } 
    public virtual ICollection<PriceCalculationNotification> Notifications { get; set; } 
    public Guid CalculationResultId { get; set; } 
} 

public class Cost : BaseEntity<Guid> 
{ 
    public BasePrice Price { get; set; } 
    public decimal Amount { get; set; } 
    public Vendor Vendor { get; set; } 
    public Guid FlightCostInfoId { get; set; } 
} 

и картографирование для них:

internal class FlightCostInfoMapping : EntityTypeConfiguration<FlightCostInfo> 
    { 
     public FlightCostInfoMapping() 
     { 
      HasKey(i => i.Id); 
      Property(i => i.CalculationResultId).HasColumnName("CalculationResult_Id"); 
      HasOptional(i => i.FlightInfo); 
      HasMany(i => i.Costs).WithRequired().HasForeignKey(c => c.FlightCostInfoId); 
      HasMany(i => i.Notifications).WithRequired().HasForeignKey(n => n.FlightCostInfoId); 
     } 
    } 

internal class CostMapping : EntityTypeConfiguration<Cost> 
{ 
    public CostMapping() 
    { 
     HasKey(c => c.Id); 
     Property(c => c.FlightCostInfoId).HasColumnName("FlightCostInfo_Id"); 
     HasRequired(c => c.Price); 
     HasRequired(c => c.Vendor); 
    } 
} 

Когда я экономлю Список FlightCostInfo где каждый содержит один или больше Объекты затрат Получаю следующую ошибку:

Нарушение множественности. Роль FlightCostInfo_Costs_Source отношений Charges.Infrastructure.DataAccess.FlightCostInfo_Costs имеет кратность 1 или 0..1

Я не имею ни малейшего представления, почему это происходит. Может ли кто-нибудь помочь?

Update: код, чтобы сохранить список из FlightCostInfo:

 public virtual void Save(IEnumerable<TObject> entities) 
     { 
      Context.Configuration.AutoDetectChangesEnabled = false; 
      entities.ToList().ForEach(entity => 
      { 
       if (Equals(entity.Id, default(TKey)) || !Context.ChangeTracker.Entries<TObject>().ToList().Any(dbEntry => dbEntry.Entity.Id.Equals(entity.Id))) 
       { 
        Set.Add(entity); 
       } 
      }); 

      Context.ChangeTracker.DetectChanges(); 
      SaveChanges(); 
      Context.Configuration.AutoDetectChangesEnabled = true; 
     } 

     protected void SaveChanges() 
     { 
      var entriesWithGuidKey = Context.ChangeTracker.Entries<BaseEntity<Guid>>().Where(e => e.Entity.Id == Guid.Empty).ToList(); 
      entriesWithGuidKey.ForEach(e => e.Entity.Id = Guid.NewGuid()); 

      var entriesWithPeriodicValidity = Context.ChangeTracker.Entries<IPeriodicValidityObject>().ToList(); 
      entriesWithPeriodicValidity.ForEach(e => 
       { 
        if (e.State != System.Data.EntityState.Unchanged) 
        { 
         e.Entity.ChangedDate = DateTime.UtcNow; 
        } 
       }); 
      Context.SaveChanges(); 
     } 
+0

Вы можете разместить код, который вы используете для создания и сохранения списка 'FlightCostInfo'? – greg84

+0

@ greg84 См. Мое обновление. –

+0

К сожалению, я имел в виду код, который создает список 'FlightCostInfo' и добавляет к ним сущности' Cost' ... – greg84

ответ

2

Проблема оказалась в Equals перегрузки для BaseEntity. Поэтому EF считал, что все объекты Cost в коллекции FlightCostInfo равны.

Закрыв вопрос

Смежные вопросы