Breeze在扩展时排除外键为null的实体

时间:2014-02-07 17:30:34

标签: c# javascript entity-framework angularjs breeze

我的数据库中有一个具有null外键的实体。

当我通过JavaScript expand或EF中的Include时,具有该外键的行将丢失。

SQL:

CREATE TABLE Entity
(
    Id BIGINT NOT NULL PRIMARY KEY
);

CREATE TABLE EntityType
(
    Id BIGINT IDENTITY NOT NULL PRIMARY KEY,
    EntityId BIGINT NULL REFERENCES Entity(Id)
);

INSERT INTO Entity(Id) VALUES (0);
INSERT INTO Entity(Id) VALUES (1);

INSERT INTO EntityType(EntityId) VALUES (0);
INSERT INTO EntityType(EntityId) VALUES (1);
INSERT INTO EntityType(EntityId) VALUES (NULL);

C#:

public class Entity
{
    public long Id { get; set; }
}

public class EntityType
{
    public long Id { get; set; }
    public long EntityId { get; set; }
    public Entity Entity { get; set; }
}

public class EntityMap : EntityTypeConfiguration<Entity>
{
    public EntityMap()
    {
        HasKey(t => t.Id);
    }
}

public class EntityTypeMap : EntityTypeConfiguration<EntityType>
{
    public EntityTypeMap()
    {
        HasKey(t => t.Id);

        HasRequired(t => t.Entity)
           .WithMany()
           .HasForeignKey(t => t.EntityId);
    }
}

[BreezeController]
public class EntityController : ApiController
{
    private readonly EFContextProvider<EntityContext> _contextProvider =
        new EFContextProvider<EntityContext>();

    [HttpGet]
    public IQueryable<Entity> Entities()
    {
        return _contextProvider.Context.Entities;
    }

    [HttpGet]
    public IQueryable<EntityType> EntityType()
    {
        return _contextProvider.Context.EntityTypes;
    }
}

JS:

angular.module('App').factory('EntityTypeService', function(serviceBase) {
    function getAll {
        return serviceBase.manager.executeQuery(
            serviceBase.query.
                from('EntityTypes').
                expand('Entity')
        ).to$q();
    }

    return {
        getAll: getAll
    };
});

angular.module('App').controller('HomeCtrl', function($scope, EntityTypeService) {
    EntityTypeService.getAll().then(function(data) {
        $scope.entityTypes = data.results;
    });
});

当我检查$scope.entityTypes时,只有EntityId的行不是null

1 个答案:

答案 0 :(得分:0)

事实证明,这是EF的复制粘贴问题。

映射应该是HasOptional而不是HasRequired

public class EntityTypeMap : EntityTypeConfiguration<EntityType>
{
    public EntityTypeMap()
    {
        HasKey(t => t.Id);

        HasOptional(t => t.Entity)
           .WithMany()
           .HasForeignKey(t => t.EntityId);
    }
}

这将产生EntityType的所有行。