CTP5 Code-First - 设置外键列的名称 [英] CTP5 Code-First - Setting name of foreign key column

查看:84
本文介绍了CTP5 Code-First - 设置外键列的名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我尝试使用非标准列名映射外键时,我遇到了一个奇怪的异常。外键只应在新闻方面的域模型中可见,因为我不需要在
用户模型中引用用户的所有内容的集合。

I'm getting a strange exception when I try to map a foreign key with a non standard column name. The foreign key should only be visible in the domain model from the News side because I don't need a collection for everything that refers to a user inside the User model.

使用以下代码,我总是得到这个例外:

With the following code I always get this exception:



System.InvalidOperationException - Sequence包含多个匹配元素


System.InvalidOperationException - Sequence contains more than one matching element



StackTrace:

      在System.Linq.Enumerable.SingleOrDefault [TSource](IEnumerable`1 source,Func`2谓词)

       at System.Data.Entity.ModelConfiguration.Configuration.Properties.Navigation.IndependentAssociationMappingConfiguration`1.Configure(DbAssociationSetMapping associationSetMapping)

      在System.Data.Entity.ModelConfiguration.Configuration.Properties.Navigation.NavigationPropertyConfiguration.Configure(DbDatabaseMapping databaseMapping)

      在System.Data.Entity.ModelConfiguration.Configuration.Types.EntityTypeConfiguration。<> c__DisplayClass24。< ConfigureAssociationMappings> b__23(NavigationPropertyConfiguration c)

      在System.Data.Entity.ModelConfiguration.Utilities.IEnumerableExtensions.Each [T](IEnumerable`1 ts,Action`1 action)

      在System.Data.Entity.ModelConfiguration.Configuration.Types.EntityTypeConfiguration.ConfigureAssociationMappings(DbDatabaseMapping databaseMapping)

     ......


StackTrace:
       at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
       at System.Data.Entity.ModelConfiguration.Configuration.Properties.Navigation.IndependentAssociationMappingConfiguration`1.Configure(DbAssociationSetMapping associationSetMapping)
       at System.Data.Entity.ModelConfiguration.Configuration.Properties.Navigation.NavigationPropertyConfiguration.Configure(DbDatabaseMapping databaseMapping)
       at System.Data.Entity.ModelConfiguration.Configuration.Types.EntityTypeConfiguration.<>c__DisplayClass24.<ConfigureAssociationMappings>b__23(NavigationPropertyConfiguration c)
       at System.Data.Entity.ModelConfiguration.Utilities.IEnumerableExtensions.Each[T](IEnumerable`1 ts, Action`1 action)
       at System.Data.Entity.ModelConfiguration.Configuration.Types.EntityTypeConfiguration.ConfigureAssociationMappings(DbDatabaseMapping databaseMapping)
     ......

 

代码:

 

protected override void OnModelCreating(ModelBuilder modelBuilder)

{

    modelBuilder.Entity< User>()。Property(x => x.Id).HasColumnName(" id");

    modelBuilder.Entity< User>()。Property(x => x.Email).HasColumnName(" email");



    modelBuilder.Entity< News>()。Property(x => x.Id).HasColumnName(" id");



    modelBuilder.Entity< News>()

        .HasRequired(x => x.Author)

        .WithMany()

        .IsIndependent()

        .Map(m => m.MapKey(x => x.Id," user_id"));
$


}



公共类新闻:实体

{

   新闻(){} // EF必须支付b
$
    // FIXME:可以直接使用IUser吗?或者是否需要存储库?

   公共新闻(用户作者)

        :base(true)

    {

       作者=作者;

    }


   公共虚拟用户作者{get;组; }
}

   

   公共类用户:实体

{

   用户(){} // EF需要


    public User(string email)

        :base(true)

    {

       电子邮件=电子邮件;

    }


    public string Email {get;组; }
}



公共抽象类实体

{

   ;&NBSP;受保护的实体(bool generate = false)

    {

        if(generate)

        {

            Id = Guid.NewGuid();

        }
    }


    public virtual Guid Id {get;组; } b $ b}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>().Property(x => x.Id).HasColumnName("id");
    modelBuilder.Entity<User>().Property(x => x.Email).HasColumnName("email");

    modelBuilder.Entity<News>().Property(x => x.Id).HasColumnName("id");

    modelBuilder.Entity<News>()
        .HasRequired(x => x.Author)
        .WithMany()
        .IsIndependent()
        .Map(m => m.MapKey(x => x.Id, "user_id"));

}

public class News : Entity
{
    News() { } //Required for EF

    //FIXME: possible to use IUser directly? or is repository needed?
    public News(User author)
        : base(true)
    {
        Author = author;
    }

    public virtual User Author { get; set; }
}
   
    public class User : Entity
{
    User() { } //Required for EF

    public User(string email)
        : base(true)
    {
        Email = email;
    }

    public string Email { get; set; }
}

public abstract class Entity
{
    protected Entity(bool generate = false)
    {
        if (generate)
        {
            Id = Guid.NewGuid();
        }
    }

    public virtual Guid Id { get; set; }
}

推荐答案

查看此主题:

http:// social .msdn.microsoft.com /论坛/ en-US / adonetefx / thread / f058097d-a0e7-4393-98ef-3b13ab5b165d

干杯,

Andrew。


这篇关于CTP5 Code-First - 设置外键列的名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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