gpt4 book ai didi

c# - 关于 EF Code First Fluent API、TPH 和外键的困难

转载 作者:行者123 更新时间:2023-11-30 17:14:19 26 4
gpt4 key购买 nike

我的数据库中有两个表。一个称为 Users,另一个称为 WidgetsWidgets 表代表我的代码模型中的 3 个实体。其中一个实体 Widget 是其他两个实体 WidgetTypeAWidgetTypeB 的父类。 WidgetTypeAWidgetTypeB 都具有指向用户实体的导航属性,该实体保存在数据库中的用户表中。我无法让 Code First 为 WidgetTypeAWidgetTypeB 实体 (UserId) 使用相同的外键。有谁知道如何做到这一点?这似乎应该是 Table Per Hierarchy 映射的常见问题。

我的实体类如下:

public class Widget
{
public int Id { get; set; }

public string Name { get; set; }
}

class WidgetMap : EntityTypeConfiguration<Widget>
{
public WidgetMap()
{
ToTable("Widgets");

HasKey(w => w.Id);
Property(w => w.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

Property(w => w.Name)
.IsRequired()
.HasMaxLength(75)
.IsUnicode(true);
}
}

public class WidgetTypeA : Widget
{
public int UserId { get; set; }
public virtual User User { get; set; }

public string Color { get; set; }
public int DepthLevel { get; set; }
}

class WidgetTypeAMap : EntityTypeConfiguration<WidgetTypeA>
{
public WidgetTypeAMap()
{
Map(w => w.Requires("WidgetTypeId").HasValue(1));

HasRequired(w => w.User)
.WithMany(u => u.WidgetTypeAs)
.HasForeignKey(w => w.UserId)
.WillCascadeOnDelete(false);

Property(w => w.Color)
.IsOptional()
.IsUnicode(true)
.HasMaxLength(75);

Property(w => w.DepthLevel)
.IsOptional();
}
}

public class WidgetTypeB : Widget
{
public int UserId { get; set; }
public virtual User User { get; set; }
}

class WidgetTypeBMap : EntityTypeConfiguration<WidgetTypeB>
{
public WidgetTypeBMap()
{
Map(w => w.Requires("WidgetTypeId").HasValue(2));

HasRequired(w => w.User)
.WithMany(u => u.WidgetTypeBs)
.HasForeignKey(w => w.UserId)
.WillCascadeOnDelete(false);
}
}

public class User
{
public int Id { get; set; }
public string Username { get; set; }
public int Age { get; set; }

public virtual ICollection<WidgetTypeA> WidgetTypeAs { get; set; }
public virtual ICollection<WidgetTypeB> WidgetTypeBs { get; set; }
}

class UserMap : EntityTypeConfiguration<User>
{
public UserMap()
{
ToTable("Users");

HasKey(u => u.Id);

Property(u => u.Username)
.IsRequired()
.HasMaxLength(75)
.IsUnicode(true);

Property(u => u.Age)
.IsRequired();
}
}

无论如何,我总是收到错误

Invalid column name 'UserId1'

当我尝试执行以下操作时:

using (var entities = new MyEntities())
{
User u = new User
{
Username = "Frank",
Age = 14
};
entities.Users.Add(u);
entities.SaveChanges();

WidgetTypeA wa1 = new WidgetTypeA
{
Name = "0SDF81",
UserId = u.Id,
DepthLevel = 6
};
entities.WidgetTypeAs.Add(wa1);
entities.SaveChanges();
}

不确定这是否可以修复。我总是可以为 Widgets 表指定第二个 UserId 外键,但这似乎毫无意义。也许有一种方法可以使用 Fluent API 来做到这一点?

最佳答案

您不能将不同派生实体中定义的属性映射到同一列。这是 EF 中的限制。如果您的 WidgetTypeAUserId 属性,而您的 WidgetTypeBUserId 属性,它们在数据库中必须是不同的列。如果您将 UserIdUser 属性从派生类型移动到父 Widget 类型,它应该可以工作。

关于c# - 关于 EF Code First Fluent API、TPH 和外键的困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8904218/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com