[英]Entity Framework inserting record with composite key not inserting second field
我在使用Entity Framework 6通過子對象插入時遇到問題。
我有兩節課:
public class RoleInstance
{
[Key, Column(Order = 1)]
public long RoleId { get; set; }
[Key, Column(Order = 2)]
public string EnvirCode { get; set; }
public int PathId { get; set; }
public char Published { get; set; }
[ForeignKey("RoleId")]
public virtual Role Role { get; set; }
[ForeignKey("PathId")]
public virtual RoutingPath RoutingPath { get; set; }
[ForeignKey("EnvirCode")]
public virtual Environment Environment { get; set; }
public ICollection<ActiveDirectoryGroup> ActiveDirectoryGroups { get; set; }
}
public class ActiveDirectoryGroup
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Column(Order = 1), Key]
public long RoleId { get; set; }
[Column(Order = 2), Key]
public string EnvirCode { get; set; }
public string GroupName { get; set; }
public string GroupGuid { get; set; }
public char AuditGroup { get; set; }
[ForeignKey("RoleId,EnvirCode")]
public virtual RoleInstance RoleInstance { get; set; }
}
我正在嘗試使用以下代碼插入記錄:
RoleInstance ri = new RoleInstance { RoleId = 1,
EnvirCode = "ENVIR",
PathId = 5,
Published = 'Y'
ActiveDirectoryGroups = new List<ActiveDirectoryGroups>()
};
ri.ActiveDirectoryGroups.Add(new ActiveDirectoryGroup() {
GroupName = "GROUP NAME",
AuditGroup = 'Y'
};
_db.Context.Add(ri);
然后,當我保存它時,它將記錄插入RoleInstance
因為Entity Framework不會在ActivityDirectoryGroup
設置EnvirCode
。
這是我的modelBuilder
樣子:
modelBuilder.Entity<ActiveDirectoryGroup>()
.HasRequired(e => e.RoleInstance)
.WithMany(e => e.ActiveDirectoryGroups)
.HasForeignKey(e => new {e.RoleId, e.EnvirCode});
如果兩者的鍵都是(RoleId,EnvirCode),則RoleInstance不能有多個ActiveDirectoryGroups。 將ActiveDirecoryGroups的密鑰切換為ID,或者將(RoleId,EnvirCode,Id)切換為一對多關系。 而且您不需要在這里混合Fluent和基於屬性的映射。
這是一個工作模型:
using System;
using System.Linq;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
namespace Ef6Test
{
public class Role
{
public long RoleId { get; set; }
}
public class RoutingPath
{
public int RoutingPathId { get; set; }
}
public class Environment
{
public string EnvironmentId { get; set; }
}
public class RoleInstance
{
[Key, Column(Order = 1)]
public long RoleId { get; set; }
[Key, Column(Order = 2)]
public string EnvirCode { get; set; }
public int PathId { get; set; }
public char Published { get; set; }
[ForeignKey("RoleId")]
public virtual Role Role { get; set; }
[ForeignKey("PathId")]
public virtual RoutingPath RoutingPath { get; set; }
[ForeignKey("EnvirCode")]
public virtual Environment Environment { get; set; }
public ICollection<ActiveDirectoryGroup> ActiveDirectoryGroups { get; } = new HashSet<ActiveDirectoryGroup>();
}
public class ActiveDirectoryGroup
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity), Key]
public int Id { get; set; }
public long RoleId { get; set; }
public string EnvirCode { get; set; }
public string GroupName { get; set; }
public string GroupGuid { get; set; }
public char AuditGroup { get; set; }
[ForeignKey("RoleId,EnvirCode")]
public virtual RoleInstance RoleInstance { get; set; }
}
class Db : DbContext
{
public DbSet<ActiveDirectoryGroup> ActiveDirectoryGroups { get; set; }
public DbSet<RoleInstance> RoleInstances { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}
class Program
{
static void Main(string[] args)
{
Database.SetInitializer(new DropCreateDatabaseAlways<Db>());
using (var db = new Db())
{
db.Database.Initialize(false);
db.Database.Log = msg => Console.WriteLine(msg);
RoleInstance ri = new RoleInstance
{
Role = new Role() { RoleId = 1},
Environment = new Environment() { EnvironmentId = "ENVIR" },
RoutingPath = new RoutingPath() { RoutingPathId = 5 },
Published = 'Y'
};
ri.ActiveDirectoryGroups.Add(new ActiveDirectoryGroup()
{
GroupName = "GROUP NAME",
AuditGroup = 'Y'
});
db.RoleInstances.Add(ri);
db.SaveChanges();
}
using (var db = new Db())
{
foreach (var g in db.ActiveDirectoryGroups)
{
Console.WriteLine($"RoleId: {g.RoleId}, EnvirCode: { g.EnvirCode}");
}
}
Console.ReadKey();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.