从具有相同类型的联结表加载导航属性

时间:2013-08-20 18:10:24

标签: entity-framework breeze

我有以下课程:

public abstract class Contact
{
    public int Id { get; set; }

    public ICollection<Address> Addresses { get; set; }
    public ICollection<ContactProfile> Profiles { get; set; }
    public ICollection<ContactProfile> ContactProfiles { get; set; }
}

[Table("Persons")]
public class Person : Contact
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Organization Employer { get; set; }
}

[Table("Organizations")]
public class Organization : Contact
{
    public string Name { get; set; }
}

public class ContactProfile
{
    public int Id { get; set; }
    public int ContactId { get; set; }
    public int ProfileId { get; set; }

    public virtual Contact Contact { get; set; }
    public virtual Contact Profile { get; set; }
}

使用以下流畅的API映射:

    modelBuilder.Entity<Contact>()
                .HasMany(c => c.Profiles)
                .WithRequired(c => c.Contact)
                .WillCascadeOnDelete(false);

    modelBuilder.Entity<Contact>()
                .HasMany(c => c.ContactProfiles)
                .WithRequired(c => c.Profile)
                .WillCascadeOnDelete(false);

我的BreezeApi方法:

public IQueryable<Contact> Contacts()
{
    var contacts = _contextProvider.Context.Contacts
        .Include("Profiles")
        //.Include("Profiles.Contact") // Object expected on client side
        .Include("Addresses")

    return contacts;
}

当我想使用breeze查询检索数据时:

var query = entityQuery.from("Contacts");

将从BreezeJS中引发一个对象预期异常:

TypeError: Object expected
   at Anonymous function (../breeze.debug.js:13283:36)

但仅限于,当我想从联结表(ContactProfile)加载一个包含类似“Profiles.Contact”等的导航属性时。

服务器端的一切都运行良好,数据库也成功生成。

我错过了什么吗?

修改

我已经更新了我的数据模型。仅当雇主和ContactProfile关联设置时才会出现例外:

var people = new List<Person>
    {
        new Person
        {
            FirstName = "Jan Dae",
            LastName="Dae",
            Addresses = new List<Address>{addresses[0]},
            Employer = organizations[0] // Exception when both are set
        }
    };
people.ForEach(p => context.Contacts.Add(p));

var references = new List<ContactProfile>
    {
        new ContactProfile
            {
                Contact = people[0],
                Profile = organizations[0] //Exception when both are set
            }
    };
references.ForEach(r => context.ContactProfiles.Add(r));

1 个答案:

答案 0 :(得分:0)

我无法重现您的问题。

我可以使用或不使用'.Include(“Profiles.Contact”)'来获得结果。

所以你知道我是如何测试它的,我将你的实体添加到TODO样本中,播种数据库并查询。

请提供一个小解决方案(即启用NuGet包恢复和删除包文件夹)来显示问题,这样我们就可能出错了。将解决方案发送至Breeze-Support@ideablade.com。

修改

我能够重现这个问题。我正在和我们的高级工程师核实这是不是一个错误。

顺便说一下,在测试您的解决方案时,我注意到您的Person-Organization关联没有正确设置。 (甚至以为我在正确设置后仍然会收到错误)

请注意,Breeze关联需要外键。此外,由于您似乎正在尝试设置单向关联,因此应使用Fluent API:

  modelBuilder.Entity<Person>()
    .HasRequired(t => t.Employer)
    .WithMany()     
    .WillCascadeOnDelete(false);