データベース(InvalidOperationExceptionが)に保存されていない:ベンダーおよびブランドとベース抽象クラスネットEFレコードが、私はテーブルを持っている
public abstract class Entity<TEntity, TKeyType> : IEntity<TEntity, TKeyType>
where TEntity : class
{
[Key]
public virtual TKeyType ID { get; set; }
public virtual bool IsDeleted { get; set; }
#region Equals
public virtual bool Equals(Entity<TEntity, TKeyType> other)
{
if (ReferenceEquals(this, other))
return true;
if (other == null || !(other is TEntity))
return false;
return ID.Equals(other.ID);
}
public override bool Equals(object obj)
{
var compareTo = obj as Entity<TEntity, TKeyType>;
return Equals(compareTo);
}
public override int GetHashCode()
{
return ID.GetHashCode();
}
#endregion
}
エンティティ:
public partial class Vendor : Entity<Vendor, long>
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Vendor()
{
Brand = new HashSet<Brand>();
}
[Required]
[StringLength(32)]
public string Name { get; set; }
public Guid Guid { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Brand> Brand { get; set; }
}
と
public partial class Brand : Entity<Brand, long>
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Brand()
{
SubBrand = new HashSet<SubBrand>();
}
[Required]
[StringLength(64)]
public string Name { get; set; }
public Guid Guid { get; set; }
public long VendorID { get; set; }
public virtual Vendor Vendor { get; set; }
}
ODMSDBContext:
サービスで方法を存在する - 私はエラーを取得し保存にリポジトリから
public class EntityRepository<TEntity, TKeyType> : IEntityRepository<ODMSDBContext, TEntity, TKeyType>
where TEntity : class, IEntity<TEntity, TKeyType>
{
private readonly ODMSDBContext _context;
private DbSet<TEntity> DbSet => _context.Set<TEntity>();
public EntityRepository(ODMSDBContext context)
{
_context = context;
}
...
public void Create(IEnumerable<TEntity> entities)
{
DbSet.AddRange(entities);
}
public void Save()
{
_context.SaveChanges();
transaction.Commit();
}
}
}
を(_repository)を
public override void Create(IEnumerable<EntityModel> models)
{
var entities = new List<Brand>();
foreach (var model in models)
{
var entityModel = model as BrandModel;
var entity = new Brand
{
Guid = entityModel.Guid,
VendorID = entityModel.VendorID,
Name = entityModel.Name,
SortOrder = entityModel.SortOrder,
ExtraCode = entityModel.ExtraCode
};
entities.Add(entity);
}
_repository.Create(entities);
_repository.Save();
}
とコードのサンプルを作成します。
を 保存する前に3210Exception thrown: 'System.InvalidOperationException' in EntityFramework.dll
Additional information: The operation failed: The relationship could not be > changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.
私はブランドをチェックしました。ほとんどのベンダーはnullですが、VendorIDは満たされています。 は私が)
UPDを
Vendor = _vendorRepository.GetById(entityModel.VendorID)
を作成しますが、ベンダーフィールドからAddRangeデータが消滅した後に%方法でサービスでこれを追加しようとしました。私は奇妙な動作を記述する小さなビデオを作成しました。 - http://screencast.com/t/RI32v4gu
「SubBrand」コードはどこですか? – grek40
@ grek40問題ではないと思います。コードはBrandと同じですが、新しいものはありません。それは重要だと思いますか? –