好吧,我不知所措,微风轻拂我还在学习绳索。我的项目使用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并生成客户端,我可以完全消除这个问题。这是正确的想法吗?
答案 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。不确定这是解决问题的最有效方法,但似乎工作正常。