将新数据插入 MVC 中的不同表时,基本实体的 ID 字段不断增加



我正在使用工作单元和存储库制作一个MVC项目。我分离了我的模型,控制器和映射等...到解决方案中的不同库中。在我使用基本实体时,我碰巧遇到了一个问题,即我用于基于基本实体的多个表的 ID 在这种情况下增加。当我向表 A 插入新数据时,EX : 1 的 ID 自动增加,但是当我向表 B 插入新数据时,ID 会增加其值 A 的值,表 B 的第一个数据具有 ID 的值 2。我如何设法将表之间的 ID 分开,以增加表的当前值,而不是表所基于的基本实体的当前值? 这是我的基本实体:

namespace Thaco_Model.Model
{
public interface IBaseEntities
{
long ID { get; set; }
String name { get; set; }
}
public class BaseEntities : IBaseEntities
{
[Key]
public long ID { get; set; }
public String name { get; set; }
public HttpStatusCode StatusCode { get; set; }
public Boolean IsDelete { get; set; }
public int creator_ID { get; set; }
public Nullable<int> editor_ID { get; set; }
public Nullable<DateTime> created_Date { get; set; }
public Nullable<DateTime> edited_Date { get; set; }
}
}

这是我的桌子A

namespace Thaco_Model.Model
{
[Table("ValueFlag")]
public class Value_Flag :BaseEntities
{
}
}

这是我的表B:

namespace Thaco_Model.Model
{
[Table("DefinedValue")]
public class Defined_Value : BaseEntities
{
public long flag_ID { get; set; }
}
}

这是我的存储库:

namespace Data
{
public class Repository<T> : IRepository<T> where T : BaseEntities
{
private readonly DB_ver_5 context;
private IDbSet<T> entities;
string errorMessage = string.Empty;
public Repository(DB_ver_5 context)
{
this.context = context;
}
public T GetById(object id)
{
return this.Entities.Find(id);
}
public void Insert(T entity)
{
try
{
if (entity == null)
{
throw new ArgumentNullException("entity");
}
this.Entities.Add(entity);
this.context.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
errorMessage += string.Format("Property: {0} Error: {1}",
validationError.PropertyName, validationError.ErrorMessage) + Environment.NewLine;
}
}
throw new Exception(errorMessage, dbEx);
}
}
public void Update(T entity)
{
try
{
if (entity == null)
{
throw new ArgumentNullException("entity");
}
this.context.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
errorMessage += Environment.NewLine + string.Format("Property: {0} Error: {1}",
validationError.PropertyName, validationError.ErrorMessage);
}
}
throw new Exception(errorMessage, dbEx);
}
}
public void Delete(T entity)
{
try
{
if (entity == null)
{
throw new ArgumentNullException("entity");
}
this.Entities.Remove(entity);
this.context.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
errorMessage += Environment.NewLine + string.Format("Property: {0} Error: {1}",
validationError.PropertyName, validationError.ErrorMessage);
}
}
throw new Exception(errorMessage, dbEx);
}
}
public virtual IQueryable<T> Table
{
get
{
return this.Entities;
}
}
private IDbSet<T> Entities
{
get
{
if (entities == null)
{
entities = context.Set<T>();
}
return entities;
}
}
}
}

实际上,在 EF 之前,这是正常的。

您有一个具有主键的基实体类。当您使此类成为其他类的父类时,实体框架会考虑您确实想要共享属性。如果您查看数据库,您应该会看到ValueFlag没有IDDefinedValue也是如此。这是因为您的共享属性必须位于名为BaseEntity的表中。通过这样做,EF 可以实现"共享属性"的可能性。

如果要具有单独的 ID,则需要将 EF 行为从 TPT 更改为 TPC : https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-choosing-strategy-guidelines

另外,请注意继承通常很好,对于小表来说已经足够好了。当涉及到大数据时,由于 JOIN 的乘法,它会显示一些性能问题(除了 EF"正常"性能问题(。

最新更新