我有一个名为 ServiceProviders 的表,其中包含静态数据。 POCO课程如下
public class ServiceProvider
{
public virtual int Id
{
get;
set;
}
public virtual string Name
{
get;
set;
}
}
我有一个客户端表。每个客户都需要引用一个“现有”服务提供商。
public class Client
{
public virtual int Id
{
get;
set;
}
public virtual string FirstName
{
get;
set;
}
public virtual string LastName
{
get;
set;
}
public virtual ServiceProvider ServiceProvider
{
get;
set;
}
}
我正在使用EF代码第一个流畅的API配置客户端,如下所示
public ClientConfiguration(): base()
{
HasKey(e => e.Id);
Property(e => e.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
ToTable("dbo.Clients");
Property(e => e.FirstName).IsRequired().HasMaxLength(256).IsVariableLength().HasColumnType("nvarchar");
Property(e => e.LastName).IsRequired().HasMaxLength(256).IsVariableLength().HasColumnType("nvarchar");
HasRequired(e => e.ServiceProvider).WithMany().Map(m => m.MapKey("ServiceProviderId")).WillCascadeOnDelete(false);
}
当我想插入新客户的记录时,我会获得现有 ServiceProvider 实例的参考,并将其附加到客户的 ServiceProvider 属性
Client client = new Client() { FirstName = "John", LastName = "Doe" };
client.ServiceProvider = serviceproviders[0]; //An existing ServiceProvider instance fetched from DB earlier
当我调用SaveChanges时,EF会在我的 ServiceProviders 表中插入一条新的(重复)记录。我希望它只是在客户端表中插入一条新记录,并将 ServiceProviderId 列的值设置为现有的ServiceProvider实例的标识
我做错了什么?
答案 0 :(得分:2)
您需要将现有的ServiceProvider
附加到要保存新Client
的上下文中。Attach
告诉EF ServiceProvider已存在于数据库中并阻止INSERT的ServiceProvider:
Client client = new Client() { FirstName = "John", LastName = "Doe" };
context.ServiceProviders.Attach(serviceproviders[0]);
client.ServiceProvider = serviceproviders[0];