【发布时间】:2014-12-29 12:10:12
【问题描述】:
在微风和EF代码中保存多个具有一对多关系的实体首先会产生两个额外的空值实体,
我做错了什么?
这是我的代码(我从帖子中删除了所有不相关的实体和脚本)
实体
public class Server
{
public int Id { get; set; }
public ICollection<ServerAddress> Addresses { get; set; }
public string Name { get; set; }
public int DomainId { get; set; }
public Domain Domain { get; set; }
}
public class ServerAddress
{
public int Id { get; set; }
public string Ip { get; set; }
public ICollection<ServerAddressFarm> ServerAddressFarms { get; set; }
public int ServerId { get; set; }
public Server Server { get; set; }
}
DbContext
public class PortalDbContext : DbContext
{
public DbSet<Server> Servers { get; set; }
public DbSet<ServerAddress> ServerAddresses { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Server PK
modelBuilder.Entity<Server>()
.HasKey(t => t.Id)
.Property(t=>t.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
// ServerAddress PK
modelBuilder.Entity<ServerAddress>()
.HasKey(t => t.Id)
.Property(t => t.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
// Domain 1-->* Server
modelBuilder.Entity<Server>()
.HasRequired(t => t.Domain)
.WithMany(t => t.Servers)
.WillCascadeOnDelete(false);
//.HasForeignKey(t => t.DomainId);
// Server 1-->* ServerAddress
modelBuilder.Entity<ServerAddress>()
.HasRequired(t => t.Server)
.WithMany(t => t.Addresses)
.WillCascadeOnDelete(false);
}
}
角度服务
(function () {
"use strict";
angular.module('portalApp')
.service('serversService', [
'$q', '$http',
function ($q, $http) {
var self = this;
breeze.NamingConvention.camelCase.setAsDefault();
self.manager = new breeze.EntityManager('breeze/Servers');
self.addServer = function(server, serverData) {
var serverEntity = self.manager.createEntity('Server', server);
self.manager.addEntity(serverEntity);
if (serverData.ip1) {
serverData.ip1 = self.manager.createEntity('ServerAddress', { ip: serverData.ip1, server: serverEntity });
self.manager.addEntity(serverData.ip1);
server.addresses.push({ ip: serverData.ip1 });
}
if (serverData.ip2) {
serverData.ip2 = self.manager.createEntity('ServerAddress', { ip: serverData.ip2, server: serverEntity });
self.manager.addEntity(serverData.ip2);
server.addresses.push({ ip: serverData.ip2 });
}
return self.manager.saveChanges();
};
}
]);
}());
角度控制器
(function () {
"use strict";
angular.module('portalApp')
.controller('serverListCtrl', ['$rootScope', '$scope', 'serversService', 'notificationFactory',
function ($rootScope, $scope, serversService, notificationFactory) {
var vm = this;
vm.addServer = function() {
serversService.addServer(vm.server, vm.serverData)
.then(
function (data) {
vm.server = { name: null, addresses: [] };
vm.serverData = { ip1: null, ip2: null };
notificationFactory.success("server was added");
vm.getServers(vm.domain);
})
.fail(
function (reason) {
notificationFactory.errors(reason);
});
};
vm.init = function () {
vm.domain = null;
vm.server = {name: null, addresses: [{},{}]};
vm.serverData = { ip1: null, ip2: null};
};
vm.init();
}]);
}());
【问题讨论】:
-
您将 initalValues 参数提供给
EntityManager.createEntity。该对象有一个“服务器”属性,它提供了足够的信息来自动连接新创建的 ServerAddress 实体和它的父 Server 实体。self.manager.addEntity和server.addresses.push行是不必要的。要确认您的微风设置一切正常,请在createEntity行之后设置断点并检查 server.addresses 数组。它应该包含新的 ServerAddress 实体。
标签: entity-framework ef-code-first breeze