可怕的"无法为具有多部分键的实体自动生成ID#34;

时间:2014-04-09 12:46:11

标签: angularjs breeze hottowel

好吧,我不知所措,微风轻拂我还在学习绳索。我的项目使用AngularJs的热毛巾模板和John Papa的微风。

他正是我想要实现的目标:我的数据库中有一个master \ slave表。 “代理商”有许多人可以“通知”。以下是服务器端的EF类:

public class Agency {

    public Agency() {  
    this.Notifies = new HashSet<Notify>();
   }

   public long Id { get; set; }

   [Required, MaxLength(50)]
   public string Name { get; set; }
   <<removed unneeded details>>
   public bool Active { get; set; }

   public virtual ICollection<Notify> Notifies { get; set; }
}   

public class Notify
{
   public long Id { get; set; }
   public long? AgencyId { get; set; }
   public string Name { get; set; }
   <<removed unneeded details>>

   public virtual Agency Agency { get; set; }
}

现在地图:

public class AgencyMaps : EntityTypeConfiguration<Agency>
{
   internal AgencyMaps()
   {
     HasKey(x => x.Id);
   }
}

public class NotifyMap : EntityTypeConfiguration<Notify>
{
   internal NotifyMap()
   {
      HasKey(x => x.Id);

      HasOptional(x => x.Agency)
         .WithMany(p => p.Notifies)
         .HasForeignKey(i => i.AgencyId);
   }
}

现在在客户端,我使用breeze创建这样的新实体:

// create a new entity
function create() {
  return manager.createEntity(entityName);
}
// create a new notify entity
function createNotify(){
    return manager.createEntity(entityNameNotify);
}

然后我需要实现两种方案:   - 首先是我检索现有代理商并添加其他代理商的地方    人们要通知   - 其次是我创建新机构并添加人员的地方    通知

两者都在同一个地方失败。

注意:我正在使用SQL服务器,此时我的Id字段是bigint(long)。

我正在检索“Agency”实体并将其放在名为“vm.agency”的变量中。 “vm.agency”有一个名为“通知”的导航,实体类型为“通知”。因此,当我想创建并添加一个新人时,我正在调用此函数:

function addNotifyRec(){
   if (vm.agency !== undefined){
      var notifyRec = datacontext.agency.createNotify(); //<<< fails here
      notifyRec.agencyId = vm.agency.id;
      notifyRec.name = vm.notify.name;
      <<removed unneeded details>>
      vm.agency.notifies.push(notifyRec);
      logSuccess(“New person to notify added”);
   }
   else
   { logError(“Agency is undefined”); }
}

一旦调用了createNotify(),我就会得到“无法为具有多部分键的实体自动生成ID”错误。

所以我被困住了。在我看来,这是一个非常常见的情况。我显然不能很好地理解微风框架来实现这一点。如果你能指出我正确的方向,我将非常感谢你的帮助。

2014年4月9日更新 我想如果我切换到guid id并生成客户端,我可以完全消除这个问题。这是正确的想法吗?

2 个答案:

答案 0 :(得分:0)

有趣的是,Breeze认为Notify.Id和Notify.AgencyId是多部分主键,但实际上并非如此。 Id是PK,AgencyId是FK。我唯一能想到的是尝试删除Agency和Notify的EntityTypeConfiguration,特别是它指定HasKey和HasForeignKey的部分。不应该要求此Fluent API配置,因为EF将按照惯例匹配您的配置。

答案 1 :(得分:0)

我采取了不同的方法解决我的问题。由于我可以更换id类型,我将bigint id换成了Uuid类型,并删除了sql中自动生成的id。现在我只是在创建新记录时使用breeze.core.getUuid()创建自己的ID。不确定这是解决问题的最有效方法,但似乎工作正常。