gpt4 book ai didi

ef-code-first - EF 4.1 RC Code First - 映射到现有数据库并指定外键名称

转载 作者:行者123 更新时间:2023-12-04 19:19:40 27 4
gpt4 key购买 nike

我有两个类。一家公司有一个县反对它:

public class Company
{
public int Id { get; set; }
public string CompanyName { get; set; }
public Country HomeCountry { get; set; }
}

public class Country
{
public int Id { get; set; }
public string Code { get; set; }
public string Name { get; set; }
}

我试图映射到一个现有的数据库,其中 Company 表包含 Country 记录的外键。所以我大概需要先告诉代码外键列的名称。

下面是完整的代码示例。基于我尝试的不同事情,它目前因不同的异常(exception)而失败。到目前为止,似乎还缺乏相关的文档。

那么使用 Code First Fluent API 如何定义外键列的名称?

测试应用:

创建数据库如下:
创建数据库代码优先;

Use CodeFirst

create table Companies
(
Id int identity(1,1) not null,
HomeCountryId int not null,
Name varchar(20) not null,
constraint PK_Companies primary key clustered (Id)
)

create table Countries
(
Id int identity(1,1) not null
, Code varchar(4) not null
, Name varchar(20) not null
, constraint PK_Countries primary key clustered (Id)
)

alter table Companies
add
constraint FK_Company_HomeCountry foreign key (HomeCountryId)
references Countries (Id) on delete no action

现在运行以下 C# 应用程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity.ModelConfiguration;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.Data;

namespace CodeFirstExistingDatabase
{

class Program
{
private const string ConnectionString = @"Server=.\sql2005;Database=CodeFirst;integrated security=SSPI;";

static void Main(string[] args)
{

// Firstly, add a country record, this works fine.
Country country = new Country();
country.Code = "UK";
country.Name = "United Kingdom";

MyContext myContext = new MyContext(ConnectionString);
myContext.Countries.Add(country);
myContext.Entry(country).State = EntityState.Added;
myContext.SaveChanges();
Console.WriteLine("Saved Country");

// Now insert a Company record
Company company = new Company();
company.CompanyName = "AccessUK";
company.HomeCountry = myContext.Countries.First(e => e.Code == "UK");

myContext.Companies.Add(company);
myContext.Entry(company).State = EntityState.Added;
myContext.Entry(country).State = EntityState.Unchanged;
myContext.SaveChanges();

Console.WriteLine("Saved Company"); // If I can get here I'd he happy!

}
}

public class MyContext
: DbContext
{
public DbSet<Company> Companies { get; set; }

public DbSet<Country> Countries { get; set; }

public MyContext(string connectionString)
: base(connectionString)
{
Database.SetInitializer<MyContext>(null);
Configuration.LazyLoadingEnabled = false;
Configuration.ProxyCreationEnabled = false;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new CountryConfiguration());
modelBuilder.Configurations.Add(new CompanyConfiguration());

base.OnModelCreating(modelBuilder);
}
}

public class CompanyConfiguration
: EntityTypeConfiguration<Company>
{

public CompanyConfiguration()
: base()
{

HasKey(p => p.Id);
Property(p => p.Id)
.HasColumnName("Id")
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
.IsRequired();
Property(p => p.CompanyName)
.HasColumnName("Name")
.IsRequired();
ToTable("Companies");
}

}

public class CountryConfiguration
: EntityTypeConfiguration<Country>
{

/// <summary>
/// Initializes a new instance of the <see cref="CountryConfiguration"/> class.
/// </summary>
public CountryConfiguration()
: base()
{

HasKey(p => p.Id);
Property(p => p.Id)
.HasColumnName("Id")
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
.IsRequired();
Property(p => p.Code)
.HasColumnName("Code")
.IsRequired();
Property(p => p.Name)
.HasColumnName("Name")
.IsRequired();

ToTable("Countries");
}

}

public class Company
{
public int Id { get; set; }
public string CompanyName { get; set; }
public Country HomeCountry { get; set; }
}

public class Country
{
public int Id { get; set; }
public string Code { get; set; }
public string Name { get; set; }
}
}

保存国家时,上述失败并出现以下情况:
无效的列名“HomeCountry_Id”

任何帮助将不胜感激!

谢谢,保罗。

最佳答案

public CompanyConfiguration()
{
//...
HasRequired(x => x.HomeCountry).WithMany()
.Map(x => x.MapKey("HomeCountryId"));
}

关于ef-code-first - EF 4.1 RC Code First - 映射到现有数据库并指定外键名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5579539/

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