2017-01-18 10 views
1

Я ищу его, но я не могу его найти.Конфигурация Fluent API между двумя доменами или классами в коде Сначала, которые содержат конкретные условия

У меня есть домен 2 (класс) и назвал его класса А и класса B мой Класс Пользователь

Class A { 

    public int Id { get; set; } 


    public Guid FKCatId { get; set; } 

     public virtual Cat Cat{ get; set; } 

    } 

и My B Class Пользователь

Class B { 

    public int Id { get; set; } 

    public Guid CatId { get; set; } 
    public String CatName{ get; set; } 

} 

Теперь я хочу свободный API Сопоставление между этими классами. Пожалуйста, посмотрите ниже кода конфигурации в A-конфигурации класса:

this.HasOptional(s => s.Cat).WithMany().HasForeignKey(f => f.FKCatId); 

Примечание 1: Я не должен использовать свойство Id в классах A и B для отношений или сопоставления между этими классами.

Примечание 2: FKCatId и CatId только уникальный ключ, а не ПК или ....

Примечание 3: также нет связи между классом A и классом B в базе данных. Просто обратите внимание!

Ошибка: моя конфигурация не работает для меня.

Результат: Может ли получить объект из класса B с вышеуказанной безопасностью. Я должен соблюдать вышеизложенное (примечание 3).

Благодарен. :)

ответ

1

Что вы пытаетесь сделать, возможно на SQL-сервере, согласно this article.

Однако это невозможно в Entity Framework. Если вы указываете свой внешний ключ (FKCatId) на Entity «B», вы никогда не определяете, какое свойство вы ссылаетесь в классе B. Entity Framework просто предполагает, что вы всегда будете ссылаться на Ключ сущности.

Я могу, однако, подумать об обходном пути. Если таблица базы данных «B» остается тем же, вы можете отобразить эту сущность в EF следующим образом:

class Program 
{ 
    static void Main() 
    { 
     using (var context = new ProductContext()) 
     { 
      var cat1 = new Cat {CatId = Guid.NewGuid(), CatName = "MyCat1"}; 
      var cat2 = new Cat {CatId = Guid.NewGuid(), CatName = "MyCat2"}; 
      context.Cats.Add(cat1); 
      context.Cats.Add(cat2); 
      context.Products.Add(new Product {Cat = cat1}); 
      context.Products.Add(new Product {Cat = cat2}); 
      context.SaveChanges(); 
     } 
    } 
} 

public class ProductContext : DbContext 
{ 
    public DbSet<Product> Products { get; set; } 
    public DbSet<Cat> Cats { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     modelBuilder.Entity<Product>().HasOptional(s => s.Cat).WithMany().HasForeignKey(f => f.FkCatId); 
    } 
} 

public class Product 
{ 
    public int Id { get; set; } 
    public Guid? FkCatId { get; set; } 
    public virtual Cat Cat { get; set; } 
} 

public class Cat 
{ 
    [Key] 
    public Guid CatId { get; set; } 
    public string CatName { get; set; } 

} 

Это работает безупречно, когда ваш DB выглядит следующим образом:

CREATE TABLE [dbo].[Cats](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [CatId] [uniqueidentifier] NOT NULL, 
    [CatName] [varchar](max) NULL, 
    CONSTRAINT [PK_Cats] PRIMARY KEY CLUSTERED 
     ([Id] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

CREATE TABLE [dbo].[Products](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [FkCatId] [uniqueidentifier] NULL, 
    CONSTRAINT [PK_dbo.Products] PRIMARY KEY CLUSTERED 
     ([Id] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
    ) ON [PRIMARY]; 

ALTER TABLE [dbo].[Products] WITH CHECK ADD CONSTRAINT [FK_Products_Cats] FOREIGN KEY([FkCatId]) 
REFERENCES [dbo].[Cats] ([CatId]); 

ALTER TABLE [dbo].[Products] CHECK CONSTRAINT [FK_Products_Cats]; 

В самом деле, это то, что должен делать ORM: сопоставить между концепциями кода и вашим дизайном БД, которые не всегда должны быть одинаковыми.