【问题标题】:Foreign key issues in EF6 CFEF6 CF 中的外键问题
【发布时间】:2014-01-07 12:13:35
【问题描述】:

对不起,当谈到代码时,我是 EF 的菜鸟。我的问题是我不想将外键属性添加到模型中,根据 MSDN,使用 fluent API 没有问题,但是我无法确定当前情况的正确用途。看起来很简单:

public class Package
{
    public Package()
    {
        Users = new Collection<User>();
    }

    public Int32 Id {get; set;}
    public String Name {get; set;}
    public virtual User Creator {get; set;}

    public virtual ICollection<User> Users {get; set;}
}

public class User
{
    public Int32 Id {get; set;}
    public String Name {get; set;}
}

public class PackageContext : DbContext
{
    public DbSet<Package> Packages {get; set;}

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Package>().HasRequired(p => p.Creator).WithMany();
        modelBuilder.Entity<Package>().HasMany(p => p.Users).WithRequired().Map(c => c.MapKey("PackageId"));

        base.OnModelCreating(modelBuilder);
    }
}

我尝试了许多不同的流畅组合,但没有一个能正常工作。我得到的最常见的例外是:

System.Data.Entity.Infrastructure.DbUpdateException:保存不为其关系公开外键属性的实体时发生错误。 EntityEntries 属性将返回 null,因为无法将单个实体标识为异常源。通过在实体类型中公开外键属性,可以更轻松地处理保存时的异常。

有人可以帮我找出创建模型时需要进行的正确流畅调用吗?

【问题讨论】:

    标签: c# entity-framework ef-code-first entity-framework-6 ef-fluent-api


    【解决方案1】:

    你应该使用这个:

    public class Package
    {
        public Int32 Id {get; set;}
        public String Name {get; set;}
        public Int32 UserId {get; set;}
    
        public virtual User Creator {get; set;}    
    }
    
    public class User
    {
        public User()
        {
            Packages = new Collection<Package>();
         }
    
        public Int32 Id {get; set;}
        public String Name {get; set;}
    
        public virtual ICollection<Package> Packages {get; set;}
    }
    
    public class PackageContext : DbContext
    {
        public DbSet<Package> Packages {get; set;}
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Package>().HasRequired(current => current.Creator)
                .WithMany(c=>c.Packages)
                .HasForeignKey(c=>c.UserId)
                .WillCascadeOnDelete(false);
    
        base.OnModelCreating(modelBuilder);
        }
    }
    

    【讨论】:

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