我有一个问题,过去有人可能会找到解决方案。我正在使用AddOrUpdate方法将数据库植入EF5迁移的Configuration类中。
这是域模型的快速示例:
public class Club
{
public virtual long Id { get; set; }
public virtual string Name { get; set; }
}
public class Court
{
public virtual long Id { get; set; }
public virtual string Name { get; set; }
public virtual long? ClubId { get; set; }
public virtual Club Club { get; set; }
}
然后是我的种子方法的摘录:
Club cb = new Club { Name = "Test Club 1" };
context.Set<Club>().AddOrUpdate(m=>m.Name, cb);
context.SaveChanges();
Court crt1 = new Court { ClubId = cb.Id, Name = "Court 1" };
Court crt2 = new Court { ClubId = cb.Id, Name = "Court 2" };
context.Set<Court>().AddOrUpdate(m => new { m.Name, m.ClubId }, crt1, crt2);
context.SaveChanges();
现在,一旦代码到达第7行,它将引发错误:
没有为类型'System.Nullable'1 [System.Int64]'和'System.Int64'定义二进制运算符Equal。
根据我的调查,这是由于ClubId为Nullable long。
有没有办法解决?
不是主要问题-我只是一个完美主义者,并且想看看其他人如何解决这个问题...
谢谢,
尼克·戈洛波罗德科(Nick Goloborodko)
最佳答案
我没有一个非常令人满意的答案,但是我认为需要对AddOrUpdate实现进行代码更改以解决此问题,因此我应用了一种变通方法。
简而言之,您可以手动执行同一任务,而不是使用AddOrUpdate
。例如:
private void AddOrUpdateCourt(long id, string name, string someOtherPropertyValue)
{
var court = _context.Set<Court>().SingleOrDefault(c => c.Id = id && c.Name = name);
if(court == null)
{
_context.Set<Court>().Add(new Court
{
ClubId=id,
Name=name,
SomeOtherProperty = someOtherPropertyValue
});
}
else
{
court.SomeOtherProperty = someOtherPropertyValue;
}
}