Code First Entity Framework为主键列名添加下划线 [英] Code First Entity Framework adds an underscore to a primary key column name

查看:561
本文介绍了Code First Entity Framework为主键列名添加下划线的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个域类的流畅映射,它定义了每个列的名称,包括由两个列,NotificationId和IdentityId组成的主键。这些也是外键,分别指向Notification.Id和Identity.Id。每当我使用这个映射作为查询的一部分,它会生成一个sql查询,在通知和Id(Notification_Id)之间有一个下划线,这个映射在我的映射中没有提到。



我会期望可能有一些约定,主键或外键应该看起来像这样,但似乎是奇怪的,因为我明确告诉了NotificationId的列名称。


$



添加映射文件

  public class Notifications_IdentitiesMap:EntityTypeConfiguration< Notifications_Identities> 
{
public Notifications_IdentitiesMap()
{
ToTable(Notifications.Notifications_Identities);
HasKey(x => new {x.NotificationId,x.IdentityId});
属性(x => x.IdentityId).HasColumnName(IdentityId)。HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
属性(x => x.NotificationId).HasColumnName(NotificationId)。HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
属性(x => x.SendAttempts).HasColumnName(SendAttempts);
属性(x => x.IsSent).HasColumnName(IsSent);
属性(x => x.LastSendAttempt).HasColumnName(LastSendAttempt);
HasRequired(x => x.Notification).WithMany()。HasForeignKey(x => x.NotificationId);
HasRequired(x => x.Identity).WithMany()。HasForeignKey(x => x.IdentityId);
}
}
public class Notifications_Identities
{

public Notifications_Identities()
{

}
public Notifications_Identities(通知通知,int identityId)
{
通知=通知;
IdentityId = identityId;
}
public virtual int IdentityId {get;组; }
public virtual int NotificationId {get;组; }
public virtual int SendAttempts {get;组; }
public virtual DateTime? LastSendAttempt {get;组; }
public virtual Identities.Identity Identity {get;组; }
public virtual Notification Notification {get;组; }
public bool IsSent {get;组; }
}
public class NotificationMap:EntityTypeConfiguration< Notification>
{
public NotificationMap()
{
ToTable(Notifications.Notifications);
属性(x => x.Id).HasColumnName(Id);
属性(x => x.Subject).HasColumnName(Subject)。HasMaxLength(255);
属性(x => x.Message).HasColumnName(Message);
属性(x => x.TypeId).HasColumnName(TypeId);
属性(x => x.DateCreated).HasColumnName(DateCreated);
属性(x => x.CreatorIdentityId).HasColumnName(CreatorIdentityId);

HasRequired(x => x.Creator).WithMany()。HasForeignKey(x => x.CreatorIdentityId);
}
}
public class IdentityMap:EntityTypeConfiguration< RM.Domain.Identities.Identity>
{
public IdentityMap()
{
属性(x => x.Id).HasColumnName(IDENTITYID)。HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
属性(x => x.FirstName).HasColumnName(firstname);
属性(x => x.Surname).HasColumnName(surname);
属性(x => x.Username).HasColumnName(username);
属性(x => x.IsGroup).HasColumnName(is_group);
属性(x => x.EmailAddress).HasColumnName(email);
属性(x => x.ActiveDirectoryId).HasColumnName(ActiveDirectoryId);
属性(x => x.IsLive).HasColumnName(is_active);
ToTable(dbo.rm_tbl_IDENTITY_Identities);
}
}


解决方案

犯了一个愚蠢的错误,在实体框架4.1代码第一外键ID



我添加了以下内容:

  public virtual ICollection< Notifications_Identities>身份{get;组; 

到通知实体,并没有映射



修正是要更改

  HasRequired(x => x.Notification).WithMany()。HasForeignKey (x => x.NotificationId); 

  HasRequired(x => x.Notification).WithMany(x => x.Identities).HasForeignKey(x => x.NotificationId); 


I have a fluent mapping of a domain class that defines the names for each column including the primary key which is made up of two columns, NotificationId and IdentityId. These are also foreign keys that point at Notification.Id and Identity.Id respectively. Whenever I use this mapping as part of a query it generates a sql query with an underscore in between Notification and Id (Notification_Id) that is not mentioned anywhere in my mappings.

I would expect that there might be some convention that says that primary keys or foreign keys should look like that but it seems odd given that I've explicitly told it what the column name for NotificationId is.

Any help would be appreciated.

Added mapping file

public class Notifications_IdentitiesMap : EntityTypeConfiguration<Notifications_Identities>
{
    public Notifications_IdentitiesMap()
    {
        ToTable("Notifications.Notifications_Identities");
        HasKey(x => new { x.NotificationId,x.IdentityId });
        Property(x => x.IdentityId).HasColumnName("IdentityId").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
        Property(x => x.NotificationId).HasColumnName("NotificationId").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
        Property(x => x.SendAttempts).HasColumnName("SendAttempts");
        Property(x => x.IsSent).HasColumnName("IsSent");
        Property(x => x.LastSendAttempt).HasColumnName("LastSendAttempt");
        HasRequired(x => x.Notification).WithMany().HasForeignKey(x => x.NotificationId);
        HasRequired(x => x.Identity).WithMany().HasForeignKey(x => x.IdentityId);
    }
}
public class Notifications_Identities
{

    public Notifications_Identities()
    {

    }
    public Notifications_Identities(Notification notification, int identityId)
    {
        Notification = notification;
        IdentityId = identityId;
    }
    public virtual int IdentityId { get; set; }
    public virtual int NotificationId { get; set; }
    public virtual int SendAttempts { get; set; }
    public virtual DateTime? LastSendAttempt { get; set; }
    public virtual Identities.Identity Identity { get; set; }
    public virtual Notification Notification { get; set; }
    public bool IsSent { get; set; }
}
public class NotificationMap:EntityTypeConfiguration<Notification>
{
    public NotificationMap()
    {
        ToTable("Notifications.Notifications");
        Property(x => x.Id).HasColumnName("Id");
        Property(x => x.Subject).HasColumnName("Subject").HasMaxLength(255);
        Property(x => x.Message).HasColumnName("Message");
        Property(x => x.TypeId).HasColumnName("TypeId");
        Property(x => x.DateCreated).HasColumnName("DateCreated");
        Property(x => x.CreatorIdentityId).HasColumnName("CreatorIdentityId");

        HasRequired(x => x.Creator).WithMany().HasForeignKey(x => x.CreatorIdentityId);
    }
}
public class IdentityMap : EntityTypeConfiguration<RM.Domain.Identities.Identity>
    {
        public IdentityMap()
        {
            Property(x => x.Id).HasColumnName("IDENTITYID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            Property(x => x.FirstName).HasColumnName("firstname");
            Property(x => x.Surname).HasColumnName("surname");
            Property(x => x.Username).HasColumnName("username");
            Property(x => x.IsGroup).HasColumnName("is_group");
            Property(x => x.EmailAddress).HasColumnName("email");
            Property(x => x.ActiveDirectoryId).HasColumnName("ActiveDirectoryId");
            Property(x => x.IsLive).HasColumnName("is_active");
            ToTable("dbo.rm_tbl_IDENTITY_Identities");
        }
    }

解决方案

I made a stupid mistake, found the answer in Entity Framework 4.1 Code First Foreign Key Id's

I added the following:

public virtual ICollection<Notifications_Identities> Identities { get; set; }  

to the Notification entity and didn't map it

The fix was to change

HasRequired(x => x.Notification).WithMany().HasForeignKey(x => x.NotificationId);

to

HasRequired(x => x.Notification).WithMany(x=>x.Identities).HasForeignKey(x => x.NotificationId);

这篇关于Code First Entity Framework为主键列名添加下划线的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆