有没有办法强制Entity Framework在将实体添加到上下文时立即填充外键,而不是延迟到上下文中发生其他事情?默认行为在使用数据绑定显示引用实体时并不是很有帮助。
仅从上下文引用任何DbSet就足以强制EF填充已添加的Children的Parent和Parent_Name。但是,除非调用SaveChanges,否则没有任何东西可以强制EF填充Reference或Reference_Name。
我真的想使用[Required]属性标记Reference_Name,以便它在数据库中为Not Null,但如果我这样做,当我尝试调用SaveChanges时,除非我明确设置了Reference_Name,否则我会收到验证错误,即使SaveChanges本身将正确填充Reference_Name如果Reference已设置。
我真的想能够设置Reference或Reference_Name并立即使用另一个。同样,我想在添加Child对象后立即使用Parent或Parent_Name,而无需使用一些来自上下文的其他元素的恶作剧。
有人能帮助我理解为什么EF会延迟这些内容,以及如何强制它填充外键属性或外键列,最好是立即,但至少不必调用SaveChanges吗?我真的不想在EF将正确填充它们时显式地填充所有属性。
仅从上下文引用任何DbSet就足以强制EF填充已添加的Children的Parent和Parent_Name。但是,除非调用SaveChanges,否则没有任何东西可以强制EF填充Reference或Reference_Name。
我真的想使用[Required]属性标记Reference_Name,以便它在数据库中为Not Null,但如果我这样做,当我尝试调用SaveChanges时,除非我明确设置了Reference_Name,否则我会收到验证错误,即使SaveChanges本身将正确填充Reference_Name如果Reference已设置。
我真的想能够设置Reference或Reference_Name并立即使用另一个。同样,我想在添加Child对象后立即使用Parent或Parent_Name,而无需使用一些来自上下文的其他元素的恶作剧。
有人能帮助我理解为什么EF会延迟这些内容,以及如何强制它填充外键属性或外键列,最好是立即,但至少不必调用SaveChanges吗?我真的不想在EF将正确填充它们时显式地填充所有属性。
public class OracleContext : DbContext
{
public virtual DbSet<Parent> Parents { get; set; }
public virtual DbSet<Child> Children { get; set; }
public virtual DbSet<Reference> References { get; set; }
public virtual DbSet<SomethingElse> SomethingElses { get; set; }
}
public class Parent
{
[Key, MaxLength(30)]
public string Name { get; set; }
[InverseProperty("Parent")]
public virtual List<Child> Children { get; set; } = new List<Child>();
}
public class Child
{
[Key, Column(Order = 1), MaxLength(30)]
public string Parent_Name { get; set; }
[Key, Column(Order = 2), MaxLength(30)]
public string Name { get; set; }
public string Reference_Name { get; set; }
[ForeignKey("Parent_Name")]
public virtual Parent Parent { get; set; }
[ForeignKey("Reference_Name")]
public virtual Reference Reference { get; set; }
public Child Clone()
{
return new Child
{
Parent_Name = this.Parent_Name,
Name = this.Name,
Reference_Name = this.Reference_Name,
Parent = this.Parent,
Reference = this.Reference
};
}
}
public class Reference
{
[Key, MaxLength(30)]
public string Name { get; set; }
}
public class SomethingElse
{
[Key, MaxLength(30)]
public string Name { get; set; }
}
private void button1_Click(object sender, EventArgs e)
{
OracleContext context = new OracleContext();
Reference reference = context.References.Add(new Reference { Name = "Reference" });
Parent alpha = context.Parents.Add(new Parent { Name = "Alpha" });
Child alphaOne = new Child { Name = "AlphaOne" };
Child alphatwo = new Child { Name = "AlphaTwo", Reference_Name = "Reference" };
alpha.Children.AddRange(new List<Child> { alphaOne, alphatwo });
alphaOne.Reference = reference;
var list = (
from child in alpha.Children
select new
{
Time = "Before referencing SomethingElses.Local",
Child = child.Clone()
}
).ToList();
var x = context.SomethingElses.Local;
list.AddRange(
from child in alpha.Children
select new
{
Time = "After referencing SomethingElses.Local",
Child = child.Clone()
}
);
list.AddRange(
from parent in context.Parents.Local
from child in parent.Children
select new
{
Time = "Before SaveChanges",
Child = child.Clone()
}
);
context.SaveChanges();
list.AddRange(
from parent in context.Parents.Local
from child in parent.Children
select new
{
Time = "After SaveChanges",
Child = child.Clone()
}
);
foreach (var item in list)
{
Console.WriteLine("{0}:\r\n\tName = '{1}'\r\n\tParent = '{2}' ({3})\r\n\tReference = '{4}' ({5})",
item.Time, item.Child.Name, item.Child.Parent_Name, item.Child.Parent, item.Child.Reference_Name, item.Child.Reference);
}
}
Before referencing SomethingElses.Local:
Name = 'AlphaOne'
Parent = '' ()
Reference = '' (WindowsFormsApplication2.Reference)
Before referencing SomethingElses.Local:
Name = 'AlphaTwo'
Parent = '' ()
Reference = 'Reference' ()
After referencing SomethingElses.Local:
Name = 'AlphaOne'
Parent = 'Alpha' (WindowsFormsApplication2.Parent)
Reference = '' (WindowsFormsApplication2.Reference)
After referencing SomethingElses.Local:
Name = 'AlphaTwo'
Parent = 'Alpha' (WindowsFormsApplication2.Parent)
Reference = 'Reference' ()
Before SaveChanges:
Name = 'AlphaOne'
Parent = 'Alpha' (WindowsFormsApplication2.Parent)
Reference = '' (WindowsFormsApplication2.Reference)
Before SaveChanges:
Name = 'AlphaTwo'
Parent = 'Alpha' (WindowsFormsApplication2.Parent)
Reference = 'Reference' ()
After SaveChanges:
Name = 'AlphaOne'
Parent = 'Alpha' (WindowsFormsApplication2.Parent)
Reference = 'Reference' (WindowsFormsApplication2.Reference)
After SaveChanges:
Name = 'AlphaTwo'
Parent = 'Alpha' (WindowsFormsApplication2.Parent)
Reference = 'Reference' (WindowsFormsApplication2.Reference)