我在使用代码优先方法播种数据库时遇到此错误.
一个或多个实体的验证失败.有关详细信息,请参阅"EntityValidationErrors"属性.
说实话,我不知道如何检查验证错误的内容.Visual Studio向我显示它是一个包含8个对象的数组,因此有8个验证错误.
这与我之前的模型有关,但我做了一些修改,我在下面解释:
请原谅我的长代码,但我必须将其全部粘贴.在以下代码的最后一行中抛出异常.
namespace Data.Model
{
public class Position
{
[DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]
public int PositionID { get; set; }
[Required(ErrorMessage = "Position name is required.")]
[StringLength(20, MinimumLength = 3, ErrorMessage = "Name should not be longer than 20 characters.")]
[Display(Name = "Position name")]
public string name { get; set; }
[Required(ErrorMessage = "Number of years is required")]
[Display(Name = "Number of years")]
public int yearsExperienceRequired { get; set; }
public virtual ICollection<ApplicantPosition> applicantPosition { get; set; …Run Code Online (Sandbox Code Playgroud) 让我们说我查询数据库并加载项目列表.然后我打开详细视图表单中的一个项目,而不是从数据库中重新查询该项目,我从列表中的数据源创建项目的实例.
有没有办法可以更新数据库记录而无需获取单个项目的记录?
以下是我现在正在做的一个示例:
dataItem itemToUpdate = (from t in dataEntity.items
where t.id == id
select t).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
然后在拉动记录后,我更新项目中的一些值并将记录推回:
itemToUpdate.itemstatus = newStatus;
dataEntity.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
我认为有更好的方法可以做到这一点,任何想法?
我正在使用Entity Framework 5.0与DbContext和POCO实体.有一个包含3个属性的简单实体:
public class Record
{
public int Id { get; set; }
public string Title { get; set; }
public bool IsActive { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
Title字段始终未修改,UI只显示它而不提供任何输入框来修改它.这就是将表单Title设置为null将表单发送到服务器的原因.
以下是我告诉EF执行实体的部分更新的方法(IsActive仅限字段):
public class EFRepository<TEntity>
{
...
public void PartialUpdate(TEntity entity, params Expression<Func<TEntity, object>>[] propsToUpdate)
{
dbSet.Attach(entity);
var entry = _dbContext.Entry(entity);
foreach(var prop in propsToUpdate)
contextEntry.Property(prop).IsModified = true;
}
}
Run Code Online (Sandbox Code Playgroud)
和电话:
repository.PartialUpdate(updatedRecord, r => r.IsActive);
Run Code Online (Sandbox Code Playgroud)
调用SaveChanges方法,我得到的DbEntityValidationException,告诉我,Title是必需的.当我设置dbContext.Configuration.ValidateOnSaveEnabled = false …
我想要更新他的名字是pejman的人的家庭.这是我的对象类:
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set;}
public DateTime BirthDate { get; set; }
public bool IsMale { get; set; }
public byte[] Image { get; set; }
public byte[] RowVersion { get; set; }
public virtual Person Parent { get; set; }
public virtual ICollection<PhoneNumber> PhoneNumber { get; set; }
public virtual ICollection<Address> Addresses { get; set; }
public virtual PersonInfo …Run Code Online (Sandbox Code Playgroud) 我有这个实体,想要使用entityframework进行更新
EmployeeModel employee = new EmployeeModel
{
Id = 1000, //This one must
FirstName = modifiedValue,
Email = modifiedValue,
LastName = originalValue,
Phone = originalValue
};
Run Code Online (Sandbox Code Playgroud)
要更新的代码
_db.ObjectStateManager.ChangeObjectState(employee, EntityState.Modified);
_db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
这是一旦更新的SQL语句
Update Employee set Id=1138,FirstName='modifiedValue',Email='modifiedValue',LastName= 'OriginalValue',phone='originalValue' where Id=1138
Run Code Online (Sandbox Code Playgroud)
但我期待着这一点
Update Employee set FirstName='modifiedValue', Email='modifiedValue' where Id=1138.
Run Code Online (Sandbox Code Playgroud)
我不知道我在这里缺少什么.请告诉我.
我正在试图找出如何PATCH使用Entity Framework 6.0 顺利进行实体的部分更新(基本上是HTTP ),但是我很难看到那些似乎对我不起作用的示例数量(甚至那些对于另一个版本的EF来说并不明显的人.
我想要完成的事情:
我得到的最接近的答案是通过这个非常相似的问题的答案来描述的,并通过以下代码说明:
public async Task UpdateMyEntity(int id, int? updatedProperty, string otherProperty)
{
using (var context = new MyDbContext())
{
var entity = new MyEntity { Id = id };
context.MyEntities.Attach(entity);
if (updatedProperty != null) { entity.Property = updatedProperty.Value; }
if (!string.IsNullOrEmpty(otherProperty) { entity.OtherProperty = otherProperty; }
await context.SaveChangesAsync();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,这适用于简单实体,但我得到实体验证错误,因为我有一些必需的属性和关系,这些属性和关系未更新,因此不会出现在附加实体中.如上所述,我只想忽略这些.
我已经调试并验证了对该行运行时的context.Entry(entity).Property(e => e.Property).IsModified更改true,以及我从未触摸过的所有属性仍然返回false进行类似检查,因此我认为EF能够处理此问题.
是否有可能在上述两个限制下解决这个问题?怎么样?
更新: …
我遇到了在'乐观更新'的情况下我需要具有EF readonly属性的情况(你没有从数据库加载你的域对象的当前状态来检查实际改变了什么属性.你只需将你的对象设置为Modified和将其更新到数据库.在这种情况下,您可以避免冗余的选择和合并操作).
你不能写这样的东西:DataContext.Entry(entity).Property(propertyName).IsModified = false;,因为不支持设置'false'值,你会得到一个例外.(在EF 4.1中)
我已经创建了一个简单的结构,用于在存储库中注册readonly属性.因此,您可以轻松修改非限制性属性.
你怎么看待这件事?
public abstract class RepositoryBase<T> where T : class
{
private const string MethodReferenceErrorFormat = "Expression '{0}' refers to a method, not a property.";
private const string FieldReferenceErrorFormat = "Expression '{0}' refers to a field, not a property.";
protected IList<PropertyInfo> _readOnlyProperties;
/// <summary>
/// This method is used to register readonly property for Entity.
/// </summary>
/// <param name="propertyLambda">Entity property as LambdaExpression</param>
protected void RegisterReadOnlyProperty<TProperty>(Expression<Func<T, TProperty>> propertyLambda)
{
Guard.ArgumentNotNull(propertyLambda, "propertyLambda");
var …Run Code Online (Sandbox Code Playgroud) entity-framework readonly repository-pattern entity-framework-4 entity-framework-4.1
我正在寻找一种使用Entity Framework编写代码的方法来更新符合条件的1000条记录.
在SQL中它看起来像这样
UPDATE [Items]
SET [IsInSeason] = 1
WHERE [Name] like '%summer%'
Run Code Online (Sandbox Code Playgroud)
对于我来说,只为此更新将所有项目加载到内存中是没有意义的.
我想避免编写常规的SQL语句(如果可能的话)
我有两张表A和B.他们的关系是1:N.我想更新所有子表中的一个字段,但我不知道使用什么LINQ表达式来做 - 不应该太难.
我想的是:
parentEntity.childrens.All(..lambda expr..).field = value;
Run Code Online (Sandbox Code Playgroud)
但显然它不起作用.
我知道另一种选择是foreach(..),但如果可能的话,我更喜欢L2E.