【问题标题】:Entity Framework, code first using fluent API, avoid inserting in referenced tableEntity Framework,代码优先使用fluent API,避免插入引用表
【发布时间】:2012-07-10 06:33:18
【问题描述】:

我有一个名为 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 代码优先 fluent 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 表中插入一条新的(重复的)记录。我想做的只是在 Client 表中插入一条新记录,并将 ServiceProviderId 列的值设置为现有 ServiceProvider 实例的 Id.

我做错了什么?

【问题讨论】:

  • 服务提供者是否来自 DbSet
  • 是的,他们有。我正在处理接收 ServiceProvider 实例的上下文。将它们附加到上下文中解决了这个问题。

标签: entity-framework one-to-one


【解决方案1】:

您需要将现有的ServiceProvider 附加到要保存新Client 的上下文中。Attach 告诉 EF ServiceProvider 已存在于数据库中并阻止对该 ServiceProvider 进行 INSERT:

Client client = new Client() { FirstName = "John", LastName = "Doe" };
context.ServiceProviders.Attach(serviceproviders[0]);
client.ServiceProvider = serviceproviders[0];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多