我有一个问题,过去有人可能会找到解决方案。我正在使用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;
    }
}

08-15 18:10