代码优先生成的重复外键 - 实体框架

时间:2013-01-06 22:42:55

标签: entity-framework foreign-keys code-first

好的,你可以在下面看到我的简化模型。如果我省略映射,每当我添加一个与之相关的新集合(例如请求或<)时,我会在我的基本 BusinessCardActions 表中获得数据库中生成的各种重复密钥。 strong>邀请在下面的示例代码中。

// DbContext 

public DbSet<BusinessCardAction> BusinessCardActions { get; set; }

// Classes
public abstract class BusinessCardAction
{
    public Int32 Id { get; set; }
    public User User { get; set; }
    public Int32 UserId { get; set; }
    public Int32 OtherUserId { get; set; }
    public User OtherUser { get; set; }
    public Guid UniqueId { get; set; }
    public String Email { get; set; }
    public String OtherEmail { get; set; }
    public Int32 UserAction { get; protected set; }
    public DateTime ActionDate { get; set; }
}
public abstract  class StatusAction : BusinessCardAction
{
    public Int32 Status { get; set; }
    public String Password { get; set; }
}
public class Request : StatusAction
{
    public Int32 InviteId { get; set; }
}
public class Acceptance : BusinessCardAction
{
}
public class Nudge : BusinessCardAction
{
}

public class User
{
    public Int32 Id { get; set; }
    public ICollection<Associate> AssociatedUsers { get; set; }
    public ICollection<Request> Requests { get; set; }
    public ICollection<Invite> Invites{ get; set; }
    public ICollection<BusinessCardAction> RecentActions { get; set; }
}

现在,如果没有办法在派生类中共享我的基类中的外键列,那么我对这些重复列没有太大的问题。但这不是发生的事情。以下插入后链接中显示的数据显示它们共享所需的 UserId 列。

我已经创建了一些测试代码,并在添加数据后添加了一个指向结果的链接。

var accept = new Acceptance()
    {
        Email = "tsie@mail.com",
        OtherUserId = 2,
        UserId = 1,
        OtherEmail = "jaim@l8.ca",
        Associate = "James",
        ActionDate = DateTime.Now
    };
var invite = new Invite()
    {
        Email = "tsie@ail.com",
        OtherUserId = 2,
        UserId = 1,
        OtherEmail = "jai@llev8.ca",
        Status = 1,
        Password = "Password",
        ActionDate = DateTime.Now
    };
var request = new Request()
    {
        Email = "tst@mail.com",
        OtherUserId = 2,
        UserId = 1,
        OtherEmail = "jai@llev8.ca",
        Password = "********",
        Status = 2,
        ActionDate = DateTime.Now
    };

var nudge = new Nudge()
    {
        Email = "tsi@ail.com",
        OtherUserId = 2,
        UserId = 1,
        OtherEmail = "jai@lev8.ca",
        ActionDate = DateTime.Now
    };
_businessCardActionService.Data.BusinessCardActions.Add(accept);
_businessCardActionService.Data.BusinessCardActions.Add(invite);
_businessCardActionService.Data.BusinessCardActions.Add(request);
_businessCardActionService.Data.BusinessCardActions.Add(nudge);
_businessCardActionService.Save();

按照此链接查看前面插入后的BusinessCardActionsData http://screencast.com/t/JKBcpaCT742

正如您所看到的,for不同类型存储在基类表中。不幸的是,在表的末尾有一些流氓未使用的列似乎没用。我一直在尝试映射它们,以便这些列在生成的代码中消失。

这是类的映射部分。

...

modelBuilder.Entity<Nudge>()
    .HasRequired(i => i.User)
    .WithMany()
    .HasForeignKey(i => i.UserId)
    .WillCascadeOnDelete(false);

modelBuilder.Entity<Acceptance>()
    .HasRequired(a => a.User)
    .WithMany()
    .HasForeignKey(a => a.UserId)
    .WillCascadeOnDelete(false);

modelBuilder.Entity<Nudge>()
    .HasRequired(i => i.OtherUser)
    .WithMany()
    .HasForeignKey(i => i.OtherUserId)
    .WillCascadeOnDelete(false);

modelBuilder.Entity<Acceptance>()
    .HasRequired(a => a.OtherUser)
    .WithMany()
    .HasForeignKey(a => a.OtherUser)
    .WillCascadeOnDelete(false);

而不是一个生成良好的数据库表,我只是得到以下错误,这在某种程度上是有道理的,但同时以某种方式深深地惹恼了我。也许有办法做到这一点,但我还没有找到它。

在'Ellevate.BusinessCards.Models.BusinessCardAction'类型上声明的导航属性'User'已配置了冲突的多重性。

0 个答案:

没有答案
相关问题